使用mysql_query()PHP执行INSERT语句的问题

时间:2014-11-06 11:56:59

标签: php mysql sql

基本上我试图在我的一个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);

3 个答案:

答案 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.")");
    }   
}