#php #mysql
#php #mysql
Вопрос:
Я пытаюсь разрешить пользователю комментировать профиль на моем веб-сайте. У меня есть следующий php — обновленный:
<?php
// Insert Comments into Database that user provides
$comm = mysql_real_escape_string($_POST['addComment']);
$pID4 = filter_input(INPUT_GET, 'pID', FILTER_SANITIZE_NUMBER_INT);
$cID = mysql_real_escape_string($_POST['courseInfoDD']);
$username = "###";
$password = "####";
$pdo4 = new PDO('mysql:host=localhost;dbname=###', $username, $password);
$pdo4->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sth3 = $pdo3->prepare('
INSERT INTO Comment (info, pID, cID)
VALUES(:info, :pID, :cID)
');
$sth3->execute(array(
':info' => $comm, ':pID' => $pID3, ':cID' => $cID
));
?>
http://postimage.org/image/16sbr0jd0 /
Таблица базы данных «Комментарий» (Модератор, пожалуйста, преобразуйте это в показ изображения, пожалуйста)
HTML:
<input type='text' id='addComment' name='addComment' tabindex='3' value='Enter comment' />
Выдана ошибка:
No pID specified
. Когда я пытаюсь вставить комментарий.
Ответ №1:
Вы используете одинарные кавычки в своем операторе insert :
$sth3 = $pdo3->prepare('
INSERT INTO Comment (info, pID, cID)
VALUES($comm, $pID3, $cID)
');
С помощью этих простых кавычек, $comm
не будут оцениваться — и литеральная $comm
строка будет отправлена в базу данных, что приведет к тому, чего вы, вероятно, не совсем ожидаете.
Если вы хотите, чтобы переменные были интерполированы, вам следует заключать вашу строку в двойные кавычки.
Но, поскольку вы пытаетесь использовать подготовленные инструкции, это не то, что вам следует делать, на самом деле.
Вместо этого вам следует использовать заполнители в инструкции, а затем привязать их к вашим данным при выполнении инструкции.
Я полагаю, что ваш prepare
будет выглядеть примерно так :
$sth3 = $pdo3->prepare('
INSERT INTO Comment (info, pID, cID)
VALUES(:comm, :pID3, :cID)
');
Обратите внимание на заполнители :comm
, :pID3
и :cID
.
И затем, при выполнении инструкции, вы фактически передадите некоторые реальные данные, соответствующие заполнителям :
$sth3-> выполнить(array( ‘:comm’ => $comm, ‘:pID3’ => $pID3, ‘:cID’ => $cID, ));
Дополнительное примечание: поскольку вы используете подготовленные инструкции, вам не обязательно использовать mysql_real_escape_string()
(которая, кстати, не связана с PDO и должна использоваться только при работе с mysql_*
функциями) : экранирование выполняется самим механизмом подготовленных инструкций.
Комментарии:
1. Смотрите мой обновленный код, этот метод ‘prepare’, похоже, не захватывает pID в строке ‘$pID3 = filter_input(INPUT_GET, ‘pID’, FILTER_SANITIZE_NUMBER_INT);’ где $ pID3 подготавливается как var.
2. Почему при этом не передается pID?
Ответ №2:
Параметры подготовленной инструкции PDO следует использовать следующим образом:
$sth3 = $pdo3->prepare('
INSERT INTO Comment (info, pID, cID)
VALUES(:info, :pID, :cID)
');
$sth3->execute(array(
':info' => $comm, ':pID' => $pID3, ':cID' => $cID
));
Сначала настройте «слоты» для значений, затем укажите их при выполнении запроса.
Комментарии:
1. Если я попробую это и попытаюсь отправить комментарий, он выдает ошибку о том, что для «профессора» не найден «pID». Должен ли я добавить это в запрос ‘WHERE pID = ?’ ?
2. @user700070: Нет, WHERE не используется во вставках. Похоже, что pID должен быть частью переменных GET вашего URL, как в
/addcomment.php?pID=3
.3. @user700070: Вы добавили
?pID=3
в действие формы? Это должно сработать. Хотя я бы рекомендовал вам также переместить pID в поля POST для большей ясности.
Ответ №3:
Переменные $ в строках, заключенных в одинарные кавычки, не обрабатываются. Вместо этого используйте двойные кавычки и добавляйте кавычки для самого оператора SQL:
$sth3 = $pdo3->prepare("
INSERT INTO Comment (info, pID, cID)
VALUES('$comm', '$pID3', '$cID')
");
Комментарии:
1. Учитывая, что он использует подготовленные инструкции, значения не должны вводиться в запрос — вместо этого они должны быть привязаны при выполнении инструкции.
Ответ №4:
наша проблема не имеет ничего общего ни с mysql, ни с комментариями.
Это базовый синтаксис PHP strings.
Используйте двойные кавычки, если вы хотите, чтобы переменные интерпретировались в виде строки.
Однако вы не должны добавлять переменные непосредственно в запрос, а скорее удалять их
Комментарии:
1. Однако, если я протестирую это, это не вызовет pID.