mysqli_multi_query没有插入mysql db

时间:2012-04-17 15:19:40

标签: php mysql mysqli mysqli-multi-query

我使用了教程,示例并查看了许多关于我的问题的其他问题,但仍然无法使其工作,我对PHP相对较新,对PDO没有任何了解。我已经将我的代码更改为mysqli而不是mysql来摆脱我大学给我的折旧代码,但在这种情况下他们的帮助不大。

如果有人能为我解释这个问题,我将非常感激。 以下是我的代码示例:

<?php /*connect to the db */
   $link=mysqli_connect("dbhost","user","pass");
   mysqli_select_db("db",$link);

   /*checking connection*/
      if ($link->connect_errno) 
        throw new exception(sprintf("Could not connect: %s", $link->connect_error));

session_start();



        $insert_query="
        INSERT INTO testone_tbl (age,hours,flexibility,fastpaced,retailexp,
        workedus,conviction,permit,education)
        VALUES ('$age','$hours','$flexibility','$fastpaced','$retailexp','$workedus',
        '$conviction','$permit','$education'); 
        INSERT INTO testtwo_tbl 
        (contribute,insales,initiative,success,alternatives,targets,
        newthings,custfeed,incdevelop,standards,confident,stretch,
        opportunities,polite,ideas,deadline,supported,duties)
        VALUES ('$contribute','$insales','$initiative',
        '$success','$alternatives','$targets','$newthings',
        '$custfeed','$incdevelop','$standards','$confident','$stretch',
        '$opportunities','$polite','$ideas','$deadline','$supported','$duties')";


    /*execute multi_query*/


mysqli_multi_query ($link, $insert_query);/*error1*/
/*close connection*/
if(!$link>connect_errno) $link->close(); /*error2*/

?>

数据来自(最后一种形式)写入的形式和前一种形式的会话。但是我也收到了这个错误:警告:mysqli_multi_query()期望参数1是mysqli和Warning: mysqli_close() expects parameter 1 to be mysqli,过去几天我一直坚持这个!提前谢谢。

2 个答案:

答案 0 :(得分:2)

首先,您应该检查您的Web主机是否已启用多SQL查询。

某些Web主机仅允许单SQL查询以帮助防止注入攻击。

但是,如果您想要多次插入到同一个表中,可以这样做:

INSERT INTO tbl_name (col1, col2)
     VALUES ('?', '?'),
            ('?', '?'),
            ('?', '?'); # inserts 3 records to the same table in one query

此外,如果您确实可以使用PDO,请使用它!

使用PDO对象,使用预准备语句可以使查询更安全。例如:

$db = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

$data = array($col1, $col2, $col3);
$sql = "INSERT INTO tbl_name (col1, col2, col3) VALUES ('?', '?', '?');";
$query = $db->prepare($sql); # prepares the sql statement
$query->execute($data); #binds the array of data to the ?
                        #question mark parameters, and executes.

如果您创建数据库抽象层,则可以更改数据库连接模式,而无需重写执行查询的代码。

另外,你有理由不循环和查询吗?例如:

$sql_array = array("INSERT INTO tbl_one(col1) VALUES '?';",
             "INSERT INTO tbl_two(col3) VALUES '?';");

function performAll($sql_array) {
    # execute all of the queries
}

我发现您可能正在使用某些功能来访问您的数据库连接。现在这不是问题,除非您实际尝试从函数内部访问数据库连接(如果您没有告诉我们)。例如:

$db = new PDO("...", $user, $pass);

$query = $db->prepare($sql); # works fine

function executeQuery($sql) {
    $query = $db->prepare($sql); # error: $db is not defined
                                 # within the scope of this function
    ...
}

要解决此问题,请在PHP中使用global关键字。例如:

$db = new PDO("...", $user, $pass);

function executeQuery($sql) {
    global $db; # use $db in the global scope
    $query = $db->prepare($sql); # works fine
    ...
}

答案 1 :(得分:0)

从警告中可以清楚地看出$link不是mysqli对象。您没有连接,或者在某些时候您将$link重新分配给其他人。

您还需要在连接后立即检查连接。链接上的中间操作(在本例中为mysqli_select_db)将清除已设置的任何错误。

你也不应该为mysqli混合搭配面向对象和程序风格的界面。面向对象的风格更加清晰,但如果改变现有代码太难了,那么坚持程序风格。

这样连接:

$link = mysqli_connect("dbhost","user","pass", "db"); // no need for an extra db select
if (mysqli_connect_errno()) {
    throw new Exception("Could not connect: ".mysqli_connect_error());
}

另外,我希望这不是你真正的代码,因为它对mysql注入攻击是开放的。考虑完全放弃使用多查询并使用带占位符的预准备语句。