Php &引用;“基表或视图已存在”;使用PDO创建表时

Php &引用;“基表或视图已存在”;使用PDO创建表时,php,pdo,mysqli,Php,Pdo,Mysqli,我在尝试使用PDO创建表时遇到了一个相当直接的错误。当使用标准mysqli函数发布时,下面相同的查询可以正常工作 请忽略编码风格问题,这是我遇到的问题的一个粗略的工作示例。此示例的任何部分都不应在生产环境中使用 脚本不会被重新加载或第二次调用,也不会嵌入到框架中。这是香草PHP,你看到的就是你得到的。日志写入(设置为追加模式)是为了确保脚本不会以某种方式再次被重新加载 在运行此脚本之前,我已检查以确保数据库中没有以前缀tbl\uu开头的表。该表事先不存在 脚本运行后(尽管有PDO错误消息),表会

我在尝试使用PDO创建表时遇到了一个相当直接的错误。当使用标准mysqli函数发布时,下面相同的查询可以正常工作

请忽略编码风格问题,这是我遇到的问题的一个粗略的工作示例。此示例的任何部分都不应在生产环境中使用

脚本不会被重新加载或第二次调用,也不会嵌入到框架中。这是香草PHP,你看到的就是你得到的。日志写入(设置为追加模式)是为了确保脚本不会以某种方式再次被重新加载

在运行此脚本之前,我已检查以确保数据库中没有以前缀
tbl\uu
开头的表。该表事先不存在

脚本运行后(尽管有PDO错误消息),表会显示(但只有在脚本运行后-而不是之前,因为我已经检查了三次)


这是怎么回事

如果要执行两次查询,则在首先准备语句时只需执行
execute()
,而不需要直接使用
query()
运行查询:

应该是:

$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
/////////////////////////////////////////////////
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
$stmt = $dbx_pdo->query($q);
$stmt->execute();
$stmt = $dbx_pdo->query($q);