我正在尝试将一些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的任何一般帮助/建议也欢迎!
答案 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 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.
}
答案 1 :(得分:0)
这里缺少一个关键字来将值插入表中,即VALUES。 正确的语法是
INSERT INTO tblname (id) VALUES
SELECT tablename2.colname
FROM tablename2
WHERE (col1 = 'value' AND col2 = 'value')
这些值应该是单引号,试过并自己测试,这些2每次都适合我。!