2013-03-06 2 views
0

Я использую подготовленные операторы для выполнения запроса SELECT в моей базе данных, однако характер синтаксиса SQL вызывает проблему с MySQLi.Как использовать цитаты в инструкции SQL с MySQLi Подготовленные утверждения в PHP?

Когда я пытаюсь подготовить:

SELECT user_id FROM Users WHERE email='?'; 

Я получаю сообщение об ошибке

Warning: mysqli_stmt_bind_param(): Number of variables doesn't match number of parameters in prepared statement 

Я знаю, что ошибка была вызвана поставить кавычки вокруг? но проблема в том, что эти кавычки необходимы для правильного синтаксиса SQL. Если я удалю кавычки, подготовленный оператор работает, но база данных не возвращает то, что она должна.

Есть ли что-то, что я могу сделать, или это ограничение интерфейса? Если это ограничение, что я могу сделать для выполнения этого запроса с безопасностью подготовленных заявлений?

Полный код:

$email = $_POST["email"];  
$sql = "SELECT user_id,fname,city,state,zip FROM Users WHERE email='?';"; 
      $types = 's'; 
      $stmt = $db_obj->prepare($sql); 
      if (!mysqli_stmt_bind_param($stmt, $types, $email)) { 
       echo "SQL Bind Parameter error.<br/>"; 
       exit; 
      } 
      if (!mysqli_stmt_execute($stmt)) { 
       echo "SQL Statement Execute error.<br/>"; 
       exit; 
      } 
if (!isset($row[0])) 
    exit ("No such email registered."); 
+0

Я не совсем уверен, почему это было отклонено. Я сделал несколько обширных поисков и не могу понять. Если это плохой вопрос, может кто-нибудь указать мне в правильном направлении? – TheKarateKid

+1

Я еще не проголосовал. Но проблема в вашем вопросе заключается в том, что вы не разместили свой код, просто поместили свою ошибку. –

+0

Я думал, что предоставил достаточную информацию как есть, потому что строка, которую я предоставил, является причиной ошибки. Теперь я предоставлю полный код. – TheKarateKid

ответ

1

Правильный синтаксис SELECT user_id FROM Users WHERE email=?. Ваш вопрос о заявлении не возвращает «правильные» результаты должны быть следствием:

  • Параметр, содержащий значение, чем вы ожидаете
  • Или, данные в базе данных не является то, что вы ожидаете

Обратите внимание, что в вашем запросе SELECT user_id FROM Users WHERE email='?', ? есть не параметр. Это строковый литерал «?». Этот запрос будет искать любые строки в таблице Users, где столбец email содержит значение «?»..

+0

Когда я вручную набираю инструкцию SQL в терминале MySQL без меток вокруг адреса электронной почты, я получаю синтаксическую ошибку MySQL, потому что знак «@» вызывает разрыв. Параметр должен вводиться в кавычки, но MySQLi не позволяет мне это делать. – TheKarateKid

+0

@ FireAndIce727 Когда вы вручную вводите оператор в терминал, вы не используете параметр, вы печатаете строковый литерал. Поэтому вы должны заключить строку в одинарные кавычки (например, 'SELECT user_id FROM Users WHERE email = 'someone @ example.com''). –

+0

@ FireAndIce727 Я предполагаю, что запрос «не возвращает то, что он должен», потому что '$ _POST ['email']' не содержит ожидаемого. При использовании параметров вам не нужно заключать строку в кавычки, поскольку она уже является строкой. –

1

Пожалуйста, удалите кавычки? отметка.

$stmt = $mysqli->prepare("SELECT user_id,fname,city,state,zip FROM Users WHERE email=?"); 

/* bind parameters for markers */ 
$stmt->bind_param("s", $email); 

/* execute query */ 
$stmt->execute(); 

Попробуйте это.

2

Как указано в @lc, подготовленный оператор всегда передает электронное письмо в виде строки вместо параметра в MySQL, поэтому я удалил метки кавычек, зная, что они не нужны для решения моей проблемы.

Оказывается, я не связывал выходные переменные после выполнения инструкции, поэтому даже когда подготовленный оператор выполнялся правильно, я не правильно читал ответ.

Я добавил:

mysqli_stmt_bind_result($stmt, $user_id, $fname, $city, $state, $zip); 
mysqli_stmt_fetch($stmt); 

if (empty($user_id)) 
    exit ("No such email registered."); 

Поскольку результаты базы данных были надлежащим образом быть связан с переменной сейчас, переменные, такие как $userid теперь держит данные из базы данных, которые, как ожидалось.