"Base table or view already exists" 使用 PDO 创建 table 时
"Base table or view already exists" when creating a table with PDO
我在尝试 CREATE TABLE
使用 PDO 时遇到了一个相当简单的错误。当使用标准 mysqli 函数发出时,下面的相同查询工作正常。
请忽略编码风格问题,这是我遇到的问题的粗略示例。 此示例的任何部分都不应在生产环境中使用。
$debug = true;
$ftime = date("Ymd_His_a");
$table = 'tbl_' . $ftime;
$logfile = 'debug_logfile.txt';
$db = 'somedb';
$driver = "mysqli";
$dbhost = "localhost";
$dbuser = "someuser";
$dbpass = "somepassword";
$logentry = "Initializing log file at line " . __LINE__ . '. Time: ' . $ftime . "\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);
// establish PDO connection
try{
$dbx_pdo = new PDO("mysql:dbname=$db;host=$dbhost", $dbuser, $dbpass );
$dbx_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbx_pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// write log line
$logentry = "PDO CREATED $_SERVER[PHP_SELF] from line " . __LINE__ . '. Time: ' . $ftime . "\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);
} catch(PDOException $ex) {
die(json_encode(array('outcome' => false, 'message' => 'Unable to connect')));
exit;
}
/////////////////////////////////////////////////
//
// CREATE TABLE
// first, if the table happens to exist already- drop it.
try
{
$q = "DROP TABLE IF EXISTS $table";
if ($debug) {
echo "<pre>$q</pre> at line " . __LINE__;
$logentry = "$_SERVER[PHP_SELF] from line " . __LINE__ . '. Time: ' . $ftime . '. QUERY: ' . $q . "\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);
}
$stmt = $dbx_pdo->query($q);
$stmt->execute();
$stmt->closeCursor();
} catch(PDOException $err) {
echo "<p>$q<br>ERROR: " . $err->getMessage();
exit;
}
// now try to create the table
try
{
$q = "
CREATE TABLE $table
(
`id` INT( 10 ) NULL ,
`code` VARCHAR( 20 ) NULL ,
`description` VARCHAR( 12 ) NULL
)
ENGINE = MYISAM;
";
if ($debug) {
echo "<pre>$q</pre> at line " . __LINE__;
$logentry = "$_SERVER[PHP_SELF] from line " . __LINE__ . '. Time: ' . $ftime . '. QUERY: ' . $q . "\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);
}
$stmt = $dbx_pdo->query($q);
$stmt->execute();
$stmt->closeCursor();
} catch(PDOException $err) {
$logentry = "Error near line " . __LINE__ . '. Time: ' . $ftime . '. ERROR: ' . $err->getMessage() . "\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);
echo "<p>$q<br>ERROR: " . $err->getMessage();
}
//
// CREATE TABLE
/////////////////////////////////////////////////
在 到 运行 脚本之前,我确保 logfile.txt
不存在。
在 运行 脚本之后,日志文件 logfile.txt
包含以下内容:
Initializing log file at line 10. Time: 20150120_135803_pm
PDO CREATED /program/_test2.php from line 27. Time: 20150120_135803_pm
/program/_test2.php from line 47. Time: 20150120_135803_pm. QUERY: DROP TABLE IF EXISTS tbl_20150120_135803_pm
/program/_test2.php from line 73. Time: 20150120_135803_pm. QUERY:
CREATE TABLE tbl_20150120_135803_pm
(
`id` INT( 10 ) NULL ,
`code` VARCHAR( 20 ) NULL ,
`description` VARCHAR( 12 ) NULL
)
ENGINE = MYISAM;
Error near line 83. Time: 20150120_135803_pm. ERROR: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'tbl_20150120_135803_pm' already exists
脚本没有被重新加载或第二次调用,也没有嵌入到框架中。它是香草 PHP,所见即所得。日志写入(设置为附加模式)是为了确保脚本不会以某种方式被第二次重新加载。
我已经检查以确保数据库中没有任何 table在运行之前以前缀tbl_
开头这个脚本。 table事先不存在。
脚本运行后(尽管有 PDO 错误消息)table 出现(但仅 脚本后运行 - 之前没有,因为我已经进行了三重检查)。
这是怎么回事?
你正在执行你的查询两次,你只需要 execute()
当你首先准备一个语句而不是 运行 直接使用 query()
:
的查询
$stmt = $dbx_pdo->query($q);
$stmt->execute();
应该是:
$stmt = $dbx_pdo->query($q);
我在尝试 CREATE TABLE
使用 PDO 时遇到了一个相当简单的错误。当使用标准 mysqli 函数发出时,下面的相同查询工作正常。
请忽略编码风格问题,这是我遇到的问题的粗略示例。 此示例的任何部分都不应在生产环境中使用。
$debug = true;
$ftime = date("Ymd_His_a");
$table = 'tbl_' . $ftime;
$logfile = 'debug_logfile.txt';
$db = 'somedb';
$driver = "mysqli";
$dbhost = "localhost";
$dbuser = "someuser";
$dbpass = "somepassword";
$logentry = "Initializing log file at line " . __LINE__ . '. Time: ' . $ftime . "\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);
// establish PDO connection
try{
$dbx_pdo = new PDO("mysql:dbname=$db;host=$dbhost", $dbuser, $dbpass );
$dbx_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbx_pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// write log line
$logentry = "PDO CREATED $_SERVER[PHP_SELF] from line " . __LINE__ . '. Time: ' . $ftime . "\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);
} catch(PDOException $ex) {
die(json_encode(array('outcome' => false, 'message' => 'Unable to connect')));
exit;
}
/////////////////////////////////////////////////
//
// CREATE TABLE
// first, if the table happens to exist already- drop it.
try
{
$q = "DROP TABLE IF EXISTS $table";
if ($debug) {
echo "<pre>$q</pre> at line " . __LINE__;
$logentry = "$_SERVER[PHP_SELF] from line " . __LINE__ . '. Time: ' . $ftime . '. QUERY: ' . $q . "\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);
}
$stmt = $dbx_pdo->query($q);
$stmt->execute();
$stmt->closeCursor();
} catch(PDOException $err) {
echo "<p>$q<br>ERROR: " . $err->getMessage();
exit;
}
// now try to create the table
try
{
$q = "
CREATE TABLE $table
(
`id` INT( 10 ) NULL ,
`code` VARCHAR( 20 ) NULL ,
`description` VARCHAR( 12 ) NULL
)
ENGINE = MYISAM;
";
if ($debug) {
echo "<pre>$q</pre> at line " . __LINE__;
$logentry = "$_SERVER[PHP_SELF] from line " . __LINE__ . '. Time: ' . $ftime . '. QUERY: ' . $q . "\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);
}
$stmt = $dbx_pdo->query($q);
$stmt->execute();
$stmt->closeCursor();
} catch(PDOException $err) {
$logentry = "Error near line " . __LINE__ . '. Time: ' . $ftime . '. ERROR: ' . $err->getMessage() . "\n";
file_put_contents($logfile, $logentry, FILE_APPEND | LOCK_EX);
echo "<p>$q<br>ERROR: " . $err->getMessage();
}
//
// CREATE TABLE
/////////////////////////////////////////////////
在 到 运行 脚本之前,我确保 logfile.txt
不存在。
在 运行 脚本之后,日志文件 logfile.txt
包含以下内容:
Initializing log file at line 10. Time: 20150120_135803_pm
PDO CREATED /program/_test2.php from line 27. Time: 20150120_135803_pm
/program/_test2.php from line 47. Time: 20150120_135803_pm. QUERY: DROP TABLE IF EXISTS tbl_20150120_135803_pm
/program/_test2.php from line 73. Time: 20150120_135803_pm. QUERY:
CREATE TABLE tbl_20150120_135803_pm
(
`id` INT( 10 ) NULL ,
`code` VARCHAR( 20 ) NULL ,
`description` VARCHAR( 12 ) NULL
)
ENGINE = MYISAM;
Error near line 83. Time: 20150120_135803_pm. ERROR: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'tbl_20150120_135803_pm' already exists
脚本没有被重新加载或第二次调用,也没有嵌入到框架中。它是香草 PHP,所见即所得。日志写入(设置为附加模式)是为了确保脚本不会以某种方式被第二次重新加载。
我已经检查以确保数据库中没有任何 table在运行之前以前缀tbl_
开头这个脚本。 table事先不存在。
脚本运行后(尽管有 PDO 错误消息)table 出现(但仅 脚本后运行 - 之前没有,因为我已经进行了三重检查)。
这是怎么回事?
你正在执行你的查询两次,你只需要 execute()
当你首先准备一个语句而不是 运行 直接使用 query()
:
$stmt = $dbx_pdo->query($q);
$stmt->execute();
应该是:
$stmt = $dbx_pdo->query($q);