基本上我试图在我的一个PHP
类中实现一个函数,该函数可以进入many to many
关系的联结表。
这是方法:
public function setTags($value, $id){
global $db;
$tags = $value;
$query .= "DELETE FROM directorycolumntags
WHERE directorycolumn_id = $id; ";
foreach($tags as $tag){
$query .= "INSERT INTO directorycolumntags (directorycolumn_id, tag_id)
VALUES (".$id.",".$tag.");";
}
mysql_query($query);
}
SQL
生产工作正常,因为我已回复它并通过phpMyAdmin
手动执行。但是,如果我如上所述,则永远不会插入数据。有谁知道为什么会发生这种情况?
这是它生成的sql
,当我手动输入时,它正常工作:
DELETE FROM directorycolumntags WHERE directorycolumn_id = 178;
INSERT INTO directorycolumntags (directorycolumn_id, tag_id) VALUES (178,29);
INSERT INTO directorycolumntags (directorycolumn_id, tag_id) VALUES (178,30);
INSERT INTO directorycolumntags (directorycolumn_id, tag_id) VALUES (178,32);
答案 0 :(得分:1)
http://docs.php.net/mysql_query说:
mysql_query() sends a unique query (multiple queries are not supported) to the currently active database on the server that's associated with the specified link_identifier
如果您可以使用mysqli,那么您可能感兴趣:mysqli.multi-query
Executes one or multiple queries which are concatenated by a semicolon.
答案 1 :(得分:1)
旧的,不安全的,已弃用的mysql_*
扩展程序 从不 支持多个查询。 可以,可以想象使用mysql
替换扩展程序mysqli_*
执行此操作,其中包含the mysqli_multi_query
function。
就个人而言,我并没有使用这种方法。我会做大多数开发人员会做的事情:在事务中使用预准备语句来安全地执行每个查询,并在成功时提交结果,或者在失败时回滚:
$db = new PDO(
'mysql:host=127.0.0.1;dbname=db;charset=utf8',
'user',
'pass',
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
)
);
try
{
$db->beginTransaction();
$stmt = $db->prepare('DELETE FROM tbl WHERE field = :id');
$stmt->execute(array(':id' => $id));
$stmt = $db->prepare('INSERT INTO tbl (field1, field2) VALUES (:field1, :field2)');
foreach ($tags as $tag)
{
$stmt->execute(
array(
':field1' => $id,
':field2' => $tag
)
);
$stmt->closeCursor();//<-- optional for MySQL
}
$db->commit();
}
catch (PDOException $e)
{
$db->rollBack();
echo 'Something went wrong: ', $e->getMessage();
}
略微偏离主题:你真的应该考虑使用类型提示。从您的代码中可以清楚地看出$values
应该是一个数组。类型提示可以确保传递的值实际上是一个数组。你也应该摆脱丑陋的global $db;
,而是将连接作为参数传递。这就是为什么我强烈建议您更改功能的签名:
public function setTags($value, $id){
要:
public function setTags(PDO $db, array $value, $id)
{
}
这样,调试变得容易多了:
$instance->setTags(123, 123);//in your current code will not fail immediately
$instance->setTags($db, [123], 123);//in my suggestion works but...
$instance->setTags([123], null, '');// fails with a message saying argument 1 instance of PDO expected
答案 2 :(得分:0)
你不能使用mysql_query运行多个quires,尝试像这样修改你的函数。如果你使用mysqli或pdo而不是mysql会更好,因为它很快就会被弃用,而且不适用于较新版本的php
public function setTags($value, $id){
global $db;
$tags = $value;
mysql_query("DELETE FROM directorycolumntags WHERE directorycolumn_id = $id");
foreach($tags as $tag){
mysql_query("INSERT into directorycolumntags (directorycolumn_id, tag_id) VALUES (".$id.",".$tag.")");
}
}