选择插入无效


select insert into not working

我试图插入一些id到一个新的表。id列表取自另一个表。

我代码:

     $stmt = $con->prepare('DROP TABLE tblname;
                            CREATE TABLE tblname (
                                id BIGINT
                                );
                            INSERT INTO tblname (id)
                            SELECT tablename2.colname
                            FROM tablename2
                            WHERE (col1 = "value" AND col2 = "value")');
      $stmt->execute();

我创建并转储表,因为它是更新脚本的一部分。

(有比dump/create更好的方法吗?)

脚本需要当前的id列表,我试图创建一个表与这些id。实际情况是,无论何时运行代码(使用putty),它都会返回"0",并且表仍然为空。

我做错了什么?

任何关于php/mysql的一般帮助/建议也欢迎!

首先,确保PDO设置为在查询失败时抛出异常:

$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
然后,可能捕获异常(或让异常停止应用程序)并查看错误所在。
我确信您的插入查询是,呃,off:
INSERT INTO tblname (id)
SELECT tblname2.colname
FROM tablename2
WHERE col1 = "val"

看起来模棱两可,杂乱无章,甚至更糟:它看起来不安全。但是,试试这个同样混乱的查询:

INSERT INTO tblname (id) VALUES (
    SELECT colname
    FROM tblname2
    WHERE col1 = "val"
);

最后但并非最不重要的是,确保您运行的是PHP 5.3+版本,因为在该版本之前,PDO不支持多查询。

但是,我的建议是不要为INSERT查询使用多个查询。相反,我将使用事务并分离选择和插入查询。我还将为DROP TABLECREATE TABLE查询添加一个安全网:
try
{
    $con->beginTransaction();//DROP & CREATE:
    if ($con->exec('DROP TABLE IF EXISTS tblname') === false)
    {//query wasn't executed
        $con->rollback();
        exit($con->errInfo());//error
    }
    if ($con->exec('CREATE TABLE IF NOT EXISTS tblname(...);') === false)
    {
        $con->rollback();
        exit($con->errInfo());
    }
    $con->commit();//alter tables.
    $con->beginTransaction();//INSERT TRANSACTION
    $stmt = $con->prepare('INSERT INTO tblname (id) VALUES (:id)');
    $bind = array(
        ':id' => null
    );
    $select = $con->prepare(
        'SELECT colname FROM tblname2 WHERE col1 = :val1 AND col2 = :val2'
    );
    $select->execute(
        array(
            ':val1' => 'value1',
            ':val2' => 'value2'
        )
    );
    while ($row = $select->fetch(PDO::FETCH_ASSOC))
    {
        $bind[':id'] = $row['colname'];
        $stmt->execute($bind);//inserts row
        $stmt->closeCursor();//optional
    }
    $con->commit();//save changes to db
}
catch (PDOException $e)
{
    //rollback transaction
    $con->rollback();
    exit($e->getMessage());//show what went wrong, and exit.
}

这里缺少一个用于将值插入到表中的关键字,即VALUES。正确的语法应该是

 INSERT INTO tblname (id) VALUES
                        SELECT tablename2.colname
                        FROM tablename2
                        WHERE (col1 = 'value' AND col2 = 'value')

值应该进入单引号,我自己试过了,这两个对我每次都有效!