我使用了教程,示例并查看了许多关于我的问题的其他问题,但仍然无法使其工作,我对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
,过去几天我一直坚持这个!提前谢谢。
答案 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注入攻击是开放的。考虑完全放弃使用多查询并使用带占位符的预准备语句。