Всем привет! Начал недавно изучать pdo и вот возникла ошибка, хочу сохранить введенные пользователем данные в бд, но почему то несохраняет, вот код: Код (Text): if (isset($_POST['name'])) { $name = $_POST['name']; if ($name == '') { unset($name);} } if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} } try{ $db = new PDO("mysql:dbname=baza;host=localhost","root",""); } catch(PDOException $z){ echo "Ошибка соединения: ".$z->getMessage(); exit; } $sql = "SELECT id FROM users WHERE login='$login'"; $result = $db->query($sql); $row = $result->fetchALL(PDO::FETCH_ASSOC); if (!empty($row['id'])) { exit ("<h2><center><div class='reerror'>Извините, введённый вами логин уже зарегистрирован."); } $result2 = $db->exec("INSERT INTO users (name,login,email) VALUES('$name','$login','$email')"); if ($result2=='TRUE') {echo "сохранилось";} else {echo "ошибка при сохранении!";}
Ну сделайте вместо $db->exec die и посмотрите, что за запрос у вас выдастся на экран. Попробуйте его в phpmyadmin отладить. А вообще, вы про экранирование слышали? Зачем использовать PDO, если вы не пользуетесь подстановки?
Код (Text): $db->exec("INSERT INTO users (name,login,email) VALUES('$name','$login','$email')"); Вот так писать не стоит, независимо от того, через какое расширение с базой работаете. А я дал совет, как отлаживать SQL-запросы - он тоже универсальный
выдает ошибку. Как правильнее сделать? я уже 2 день сижу, пробовал и так: Код (Text): $stmt = $db->prepare("INSERT INTO users (name,login,email) VALUES(:name,:login,:email)"); $stmt -> execute(array('name'=>'$name', 'login'=>'$login', 'email'=>'$email'));
Код (Text): array('name'=>'$name', 'login'=>'$login', 'email'=>'$email') Естественно, оно у вас не работало. Зачем заключать переменные в апострофы? Допустим, у вас $login = 'Roma_SP', а в массив вы передаете не "Roma_SP", а "$login"
Сделал без, но всё равно не записывает. Код (Text): array('name'=>"$name", 'login'=>"$login", 'email'=>"$email")
Код (Text): $stmt = $db->prepare("INSERT INTO users (name,login,email) VALUES(:name,:login,:email)"); $stmt->execute(array(':name'=>$name, :'login'=>$login, ':email'=>$email)); var_export($stmt->errorInfo()); Покажите, что выведет
ну тогда, я пасс ))) удачи тебе! в сообщении об ошибке прямо написано в чем проблема. похоже уроки попова "учат" именно те, кто читать не умеет.
Я понял что выдает неизвестный, я про if (isset($_POST['name'])) { $name = $_POST['name']; if ($name == '') { unset($name);} }
Хватило бы if ($_POST['name']) $name = $_POST['name']. Вообще довольно характерный код в стиле "имитация бурной деятельности", выдающий с головой тех, кто учился у Попова. Вообще, если $_POST состоит только из этих трех переменных (name, login, email), все три строки заменяются на extract($_POST).
Roma_SP, расскажи своими словами как ты понимаешь этот поповский фрагмент. почему надо делать именно так? у любого действия должны быть причины. смотрю на твой код и буквально каждый абзац вызывет у меня протест ))) в него даже вникать не хочется.
Код (Text): if (isset($_POST['name'])) { $name = $_POST['name']; if ($name == '') { unset($name);} } if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} } Вот по логике вещей, это должна была быть обработка случая, если скрипт вызван не из формы, без данных, или с незаполненными нужными данными. Только unset-ом вы добьётесь только одного - при попытке сделать запрос, php на вас матнётся предупреждением, если ему рот не заткнули, а в базе появится пустая запись. А оно вам надо? Нормальное поведение - если не задано нужных данных, редиректить обратно на форму. Типа такого: Код (PHP): if (empty($_POST['name']) || empty($_POST['login']) || empty($_POST['email'])) { header("Location: /register.php"); die; } Чужой код из любого источника надо не копипастить, а разбирать, что там и зачем делается. Вот вам задание: почитайте, что делает unset, что делает empty, и попробуйте ответить на вопрос, почему я написал именно это. P.S. Кстати, сам немного неверно записал, редко pdo пользуюсь. поправил в посте
PDO это хорошо, если я правильно понимаю, автор переделал код Попова чтобы вместо функций mysql* использовался pdo mysql. это прекрасно! Раз уж PDO, то грех не переписать подстановку параметров на плейхслодеры. Примеры смотри здесь: http://www.php.%6eet/manual/ru/pdo.prepare.php Код (PHP): $sth->execute(array(':calories' => 150, ':colour' => 'red'));