[mysql]选择插入不工作

标签: MySQL PHP
发布时间: 2017/4/9 23:37:18
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图插入新表中的 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。发生的是,每当我运行这段代码 (使用腻子) 返回"0"和表保留为空。

做了什么我做错了?

任何一般的帮助/咨询有关 php/mysql 欢迎太 !

解决方法 1:

首先,请确保 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 之前该版本不支持多个查询。

我的建议,不过,是能使用多个查询插入查询。相反,我将使用一个事务和单独选择并插入查询。我还想补充一个安全网, 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.
}
官方微信
官方QQ群
31647020