2013-07-16 2 views
0

это мой первый раз, используя Mysqli, и я застрял на этой проблеме около часа. Я получаю эту ошибкуsqli error with подготовить заявление

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 

я насчитал как 10 раз больше вопросительных знаков в подготовке заявления и есть 21, то я подсчитал s- и переменные в bind_param и есть 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(); 
?> 
+2

'$ _GET ['где'. $ I]' пахнет как sql injection .. – bitWorking

+0

@redreggae $ _GET ['where'. $ I] - это предложение where, в котором вся информация, переданная с последней страницы, упорядочена чтобы обновить определенный столбец, все они являются выпадающим вариантом, поэтому я не думаю, что это может произойти, исправьте меня, если я ошибаюсь, хотя, потому что я новичок в этой теме :) – user2585242

+1

да, вы ошибаетесь .. вы не можете доверять '$ _GET', '$ _POST' и' $ _COOKIE' (среди прочих). Все это легко манипулировать. Попробуйте [this] (https://addons.mozilla.org/de/firefox/addon/tamper-data/) или [это] (https://addons.mozilla.org/de/firefox/addon/poster /). – bitWorking

ответ

1

Не ставьте параметров заполнителей в кавычки.

Но это только начало ваших проблем. Посредством интерполяции $_GET['where'.$i] в ваш запрос вы открыли атаки на SQL-инъекции. Вы полностью упустили точку безопасного программирования.

Вы не должны принимать предложение WHERE или любое выражение, стенографически из HTTP-запроса, и копировать его в строку SQL. Но вы не можете использовать параметр запроса для выражения SQL, вы можете использовать только параметр вместо одного скалярного значения.

+0

ohhhh, спасибо за совет, я не знал этого, это мой первый раз, когда я это пробовал, огромное спасибо, ммм, кстати, говорящие параметрические заполнители, вы имеете в виду вопросительные знаки? извините, если это тупой вопрос:/ – user2585242

+0

Да, вопросительные знаки являются параметрами заполнителей. –

+0

Огромное вам спасибо, я получил его на работу, я собираюсь взять $ _GET ['where'. $ I] оттуда и попытаться сделать это еще раз, спасибо снова – user2585242

Смежные вопросы