【问题标题】:mysqli_multi_query not inserting to mysql dbmysqli_multi_query 未插入 mysql 数据库
【发布时间】:2012-04-28 23:01:44
【问题描述】:

我已经使用了教程、示例并查看了许多其他关于我的问题的问题,但我仍然无法让它工作,我对 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,过去几天我一直坚持这一点!提前谢谢你。

【问题讨论】:

  • 此代码甚至没有运行(缺少关闭引号)。请检查您的复制粘贴。
  • 已编辑,我遗漏了几个 INSERTS,以免只向人们扔代码并错过了结束位。

标签: php mysql mysqli mysqli-multi-query


【解决方案1】:

从警告中可以清楚地看出$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 注入攻击。考虑完全放弃使用多查询并使用带有占位符的预准备语句。

【讨论】:

  • 废话,很抱歉,我上传了错误的代码,请给我一点时间来编辑,对此我毫无保留地道歉!
【解决方案2】:

您应该首先检查您的网络主机是否启用了多 SQL 查询。

一些网络主机只允许单 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
    ...
}

【讨论】:

  • 我不循环的原因是因为我是新手,我不了解 PDO。但是,循环和查询的想法看起来确实不错。我已向我的网络主机发送电子邮件以确认他们已启用 mysqli_multi_query。我将研究循环/数组的想法,谢谢。 (col) 的意义是什么?
  • 在这种情况下,col 是您的字段名称tbl_name。我保持我的答案通用,而不是使用您自己的表/字段名称。出于兴趣,在您的代码中执行单行查询是否有效? @PurpleSmurf
  • 当它都是 mysql_ 等时它确实如此,但我将其更改为 mysqli,这是我遇到问题的地方。啊,谢谢你澄清了,不知道我在看什么。例如: ("INSERT INTO tbl_one (age) VALUES 'data', (age2) VALUES 'data2'"; etc
  • 大声笑,所以您的问题不一定是多行 SQL,因为单行也不适合您!让我修正一下我的答案...@PurpleSmurf
  • 所以 PDO 是让 multi_query 工作的最佳方式,这是否意味着我必须将所有 mysqli 代码更改为等效的 PDO ?
猜你喜欢
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2014-04-04
相关资源
最近更新 更多