Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php prepare语句出现sqli错误_Php_Mysqli - Fatal编程技术网

Php prepare语句出现sqli错误

Php prepare语句出现sqli错误,php,mysqli,Php,Mysqli,这是我第一次使用Mysqli,我被困在这个问题上大约一个小时了。我得到了这个错误 mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in C:\wamp\www\WebContent\success.php on line 30 我在prepare语句中计算了大约10倍的问号,有21个,然后我在bind_param中计算了s和变量,也有

这是我第一次使用Mysqli,我被困在这个问题上大约一个小时了。我得到了这个错误

mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters 
in prepared statement in C:\wamp\www\WebContent\success.php on line 30
我在prepare语句中计算了大约10倍的问号,有21个,然后我在bind_param中计算了s和变量,也有21个。我是Mysqli的新手,我想知道我是否能得到任何关于如何解决和调试这个问题的建议,谢谢你的帮助

<?php   


$mysqli = new mysqli("localhost", "root","","test");
if (mysqli_connect_errno())
 {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
 }


    $i=0;

 if ($stmt = $mysqli->prepare("UPDATE `table` SET `Lan_ID` = '?', `Switching` = '?',
   `Own` = '?',`Division` = '?',`Switch_Number` = '?',
   `Telecom_Circuit_number` = '?', `Transmitter_Frequency` = '?',
   `Receiver_Frequency` = '?', `Band_width` = '?', `Channel` = '?', 
   `Equipment` = '?', `Power` = '?', 
   `Line_designation` = '?', `Voltage` = '?', `Phase` = '?',
   `Modulate` = '?', `Terms` = '?', `Trap` = '?',
   `Ltunner` = '?', `Link` = '?', 
   `Comment` = '?' ". $_GET['where'.$i] ))
    {
        $stmt->bind_param('sssssssssssssssssssss', $_GET[$i.'LanID'],$_GET[$i.'Switching'],
        $_GET[$i.'Own'], $_GET[$i.'Division'], $_GET[$i.'Switch_Number'], $_GET[$i.'Telecom_Circuit_number'],
        $_GET[$i.'Trasmitter_frq'], $_GET[$i.'Receiver_frq'], $_GET[$i.'Band_width'], $_GET[$i.'Channel'],
        $_GET[$i.'Equipment'], $_GET[$i.'Power'], $_GET[$i.'Line_designation'],$_GET[$i.'Voltage'],
        $_GET[$i.'Phase'],$_GET[$i.'Modulate'],$_GET[$i.'Terms'], $_GET[$i.'Trap'],$_GET[$i.'Ltunner'],
        $_GET[$i.'Link'], $_GET[$i.'Comment'] );//this is line 30 btw


    }
    else 
    {
        printf("Prepared Statement Error: %s\n", $mysqli->error);

    }
    $stmt->close();
 ?>

不要将参数占位符放在引号内


但那只是你问题的开始。通过在查询中插入
$\u GET['where'.$i]
,您已经向SQL注入攻击敞开了大门。你完全没有抓住安全编程的要点


不能逐字从HTTP请求中获取WHERE子句或任何表达式,并将其复制到SQL字符串中。但不能对SQL表达式使用查询参数,只能使用参数代替单个标量值

$\u GET['where'.$i]
闻起来像sql注入。@redreggae$\u GET['where'.$i]是where子句,包含从上一页传递的所有信息,以便更新某个列,所有这些都是下拉选项,因此我认为不会发生这种情况,如果我错了,请纠正我,因为我不熟悉这个主题:)是的,你错了..你不能信任
$\u GET
$\u POST
$\u COOKIE
变量(以及其他变量)。这些都很容易操作。用or试试。哦,我现在明白了,谢谢你的建议:)哦,谢谢你的建议,我不知道,这是我第一次尝试这个,非常感谢,嗯,顺便说一句,参数占位符是指问号,对吗?抱歉,如果这是一个愚蠢的问题:/非常感谢,我已经开始工作了,我将从那里获得$_GET['where'.$i],并尝试另一种方式,再次感谢你