【发布时间】:2019-02-20 12:21:59
【问题描述】:
在一个进程文件中,我正在执行几个 mysqli_query 以将多组信息上传到数据库(不同的表)。第一个 mysqli_query 提交并完美运行,但其余的不起作用。我不确定我的语法哪里有错误,或者 PHP 代码有更多问题,因为我正在使用循环来获取多个更新。在 cmets 中,我添加了代码的用途以及它是否有效
//at the top declaring the sql queries
$sql_up_awarder = '';
$sql_up_history = '';
$sql_up_bike = '';
$sql_up_social = '';
$sql_up_compete = '';
//connect to server
require('conn.php');
//sqlprevent
require('sqlprevent');
//main table SQL statement that works
$sql_update = sprintf("UPDATE influencers SET inf_name = %s,inf_email = %s,inf_dob = %s,inf_mobile = %s,inf_location = %s WHERE inf_id = $vid;",
escapestring($vconncvnl, $vName, 'text'),
escapestring($vconncvnl, $vEmail, 'text'),
escapestring($vconncvnl, $vdob, 'text'),
escapestring($vconncvnl, $vphone, 'text'),
escapestring($vconncvnl, $vlocation, 'text')
);
$result_insert = mysqli_query($vconncvnl, $sql_update);
if ($vracehistory != '') {
for($i = 0; $i <count($history); $i++){
$historyid = $history[$i];
$valuehistory = $vracehistory[$i];
$valueresults = $results[$i];
$sql_up_history .= sprintf("UPDATE inf_race_history SET race_history =%s,results = %s WHERE inf_id = " . "'". $vid . "'" . " AND race_id = '$historyid';". "<br>", escapestring($vconncvnl, $valuehistory,'text'),escapestring($vconncvnl, $valueresults ,'text'));
}
} else{
$vracehistory = '';
}
$result_history = mysqli_query($vconncvnl, $sql_up_history);
当我回显$sql_up_history时,它给了我
UPDATE inf_race_history SET race_history ='51',results = '61' WHERE inf_id = 2 AND race_id = 2;
UPDATE inf_race_history SET race_history ='71',results = '81' WHERE inf_id = 2 AND race_id = 3;
当输入到 PHPMyAdmin 结果和工作时,然后按原样更新表格
但是,当我回显 $results_history 时,我什么也得不到
当我尝试使用Mysqli_error($vconncvnl); 来看看它给了我什么时
您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以获取在 ' 附近使用的正确语法 UPDATE inf_race_history SET race_history ='71',results = '81' WHERE inf_id =' at line 1
我已尝试更改更新语句中的值,使其值像
Update 'inf_race_history'
在`标记中但没有任何区别
编辑
根据 davids 的建议,我从更新部分删除了 <br>,然后将 mysqli_error() 更改为此
您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 'UPDATE inf_race_history SET race_history ='71',results = '81' WHERE inf_id = 2 A' 附近使用正确的语法
【问题讨论】:
-
您在 SQL 语句中添加了
<br>。那不是 SQL 代码,那是 HTML 代码。这似乎只是一个错字。 -
mysqli_query()无法运行多个查询 - 使用mysqli_multi_query() -
还有
sprintf()和你的escapestring()我很确定他们不会完全阻止所有 SQL 注入,请使用准备好的语句。 -
No no @NigelRen
mysqli_multi_query()is a very bad建议这意味着像1'; DELETE TABLE table这样的SQL注入也是可能的..除了你不想保护带有不安全mysqli_real_escapse_string()函数的 SQL 注入,如果使用不当,可能会造成更大的伤害和好处.. -
为什么不直接运行更新查询,而不是构建一个长而无效的命令?