fapchat
@fapchat

Как использовать prepared statements, если знак вопроса должен находиться в одинарных кавычках?

Когда я пишу
if (!($stmt1 = $connection->prepare("SELECT * FROM users WHERE email = '?'"))) {
	echo "Prepare failed: (" . $connection->errno . ") " . $connection->error;
}
у меня не срабатывает вот эта часть кода
if ($stmt1->fetch()) {  //
  echo "Вы уже зарегестрированы, создавать несколько аккаунтов с одинаковым имейлом нельзя"; //если в бд есть имеил - я  не должен дать пользователю зарегаться
    $stmt1->close();
  }
так, как мне нужно
Однако из-за кавычек в начале и в конце знака вопроса я не могу использовать Prepared statements
if (!($stmt1 = $connection->prepare("SELECT * FROM users WHERE email = '?'"))) {
	echo "Prepare failed: (" . $connection->errno . ") " . $connection->error;
} 
if (!$stmt1->bind_param("b", $email)) {
    echo "Не удалось привязать параметры: (" . $stmt1->errno . ") " . $stmt1->error;
}if (!$stmt1->execute()) {
    echo "Не удалось выполнить запрос: (" . $stmt1->errno . ") " . $stmt1->error;
}if ($stmt1->fetch()) {  //
  echo "Вы уже зарегестрированы, создавать несколько аккаунтов с одинаковым имейлом нельзя"; //не дать челику снова зарегаться
    $stmt1->close();
  }
5e174f6ecaca5720502097.png
Kак сделать так, чтобы это $stmt1->fetch()работало правильно и при этом работали Prepared statements?
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Не должен. В кавычках в SQL пишутся строки.
Плейсхолдер - это не строка. Следовательно, кавычек быть не должно.

Кроме этого, немедленно выкинуть весь этот ужас с if и echo "Не удалось трали-вали то-то". Никому неинтересно читать, что там тебе не удалось и что не получилось. Писать код надо нормально, без этого частокола if-ов.

Нумеровать стейтменты тоже не нужно, если только они не вложены в цикл. И тип надо ставить s а не b
$stmt = $connection->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
if ($stmt->fetch()) {  
  echo "Вы уже зарегестрированы, создавать несколько аккаунтов с одинаковым имейлом нельзя"; //не дать челику снова зарегаться
}


Нормальные примеры работы с mysqli смотри здесь
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SagePtr
@SagePtr
Еда - это святое
Знак вопроса не должен быть в кавычках, иначе это будет строковой литерал вместо подстановочного символа. Нужно просто:
"SELECT * FROM users WHERE email = ?"
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А кто вам сказал, что плейсхолдер надо брать в кавычки?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы