我试图插入一些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 TABLE
和CREATE 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')
值应该进入单引号,我自己试过了,这两个对我每次都有效!