选择插入不工作

时间:2014-06-18 09:43:08

标签: php mysql pdo

我正在尝试将一些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();

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

(有没有比转储/创建更好的方法?)

脚本需要当前的id列表,我试图创建一个包含这些ID的表。发生的是,每当我运行代码(使用putty)时,它返回“0”并且表保持为空。

我做错了什么?

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

2 个答案:

答案 0 :(得分:0)

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

$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

然后,也许捕获异常(或让异常停止应用程序)并查看错误 我相信你的插入查询是,呃,关闭:

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.
}

答案 1 :(得分:0)

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

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

这些值应该是单引号,试过并自己测试,这些2每次都适合我。!