2

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

4

2 回答 2

3

您应该首先检查您的网络主机是否启用了多 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
    ...
}

要解决这个问题,请使用globalPHP 中的关键字。例子:

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

function executeQuery($sql) {
    global $db; # use $db in the global scope
    $query = $db->prepare($sql); # works fine
    ...
}
于 2012-04-17T15:22:59.390 回答
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 注入攻击很开放。考虑完全放弃使用多查询并使用带有占位符的准备好的语句。

于 2012-04-17T15:29:01.130 回答