За последние 24 часа нас посетили 54188 программистов и 1726 роботов. Сейчас ищут 925 программистов ...

Проблема с сохранением pdo

Тема в разделе "PHP для новичков", создана пользователем Roma_SP, 3 июл 2014.

  1. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    Всем привет! Начал недавно изучать pdo и вот возникла ошибка, хочу сохранить введенные пользователем данные в бд, но почему то несохраняет, вот код:
    Код (Text):
    1.  
    2. if (isset($_POST['name'])) { $name = $_POST['name']; if ($name == '') { unset($name);} }
    3. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
    4. if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} }
    5. try{
    6. $db = new PDO("mysql:dbname=baza;host=localhost","root","");
    7. }
    8. catch(PDOException $z){
    9. echo "Ошибка соединения: ".$z->getMessage();
    10. exit;
    11. }
    12. $sql = "SELECT id FROM users WHERE login='$login'";
    13. $result = $db->query($sql);
    14. $row = $result->fetchALL(PDO::FETCH_ASSOC);
    15. if (!empty($row['id'])) {
    16. exit ("<h2><center><div class='reerror'>Извините, введённый вами логин уже зарегистрирован.");
    17. }
    18. $result2 = $db->exec("INSERT INTO users (name,login,email) VALUES('$name','$login','$email')");
    19. if ($result2=='TRUE')
    20. {echo "сохранилось";}
    21. else {echo "ошибка при сохранении!";}
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну сделайте вместо $db->exec die и посмотрите, что за запрос у вас выдастся на экран. Попробуйте его в phpmyadmin отладить. А вообще, вы про экранирование слышали? Зачем использовать PDO, если вы не пользуетесь подстановки?
     
  3. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    Pdo только начал изучать...
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Код (Text):
    1. $db->exec("INSERT INTO users (name,login,email) VALUES('$name','$login','$email')");
    Вот так писать не стоит, независимо от того, через какое расширение с базой работаете. А я дал совет, как отлаживать SQL-запросы - он тоже универсальный
     
  5. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    выдает ошибку.
    Как правильнее сделать? я уже 2 день сижу, пробовал и так:
    Код (Text):
    1. $stmt = $db->prepare("INSERT INTO users (name,login,email) VALUES(:name,:login,:email)");
    2. $stmt -> execute(array('name'=>'$name', 'login'=>'$login', 'email'=>'$email'));
     
  6. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Код (Text):
    1. array('name'=>'$name', 'login'=>'$login', 'email'=>'$email')
    Естественно, оно у вас не работало. Зачем заключать переменные в апострофы?
    Допустим, у вас $login = 'Roma_SP', а в массив вы передаете не "Roma_SP", а "$login"
     
  7. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    Сделал без, но всё равно не записывает.
    Код (Text):
    1. array('name'=>"$name", 'login'=>"$login", 'email'=>"$email")
     
  8. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Да вообще там кавычки не нужны. Сделайте print_r на этот массив и посмотрите, что передается.
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Код (Text):
    1.  
    2. $stmt = $db->prepare("INSERT INTO users (name,login,email) VALUES(:name,:login,:email)");
    3. $stmt->execute(array(':name'=>$name, :'login'=>$login, ':email'=>$email));
    4. var_export($stmt->errorInfo());
    Покажите, что выведет
     
  10. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    array ( 0 => '42S22', 1 => 1054, 2 => 'Unknown column \'name\' in \'field list\'', )
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    и? сам-то прочитал текст ошибки? )))

    Добавлено спустя 57 секунд:
    знакомо до боли. Попов?
     
  12. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    Да попов. А как правильно?
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ну тогда, я пасс ))) удачи тебе!

    в сообщении об ошибке прямо написано в чем проблема. похоже уроки попова "учат" именно те, кто читать не умеет.
     
  14. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    Я понял что выдает неизвестный, я про if (isset($_POST['name'])) { $name = $_POST['name']; if ($name == '') { unset($name);} }
     
  15. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Хватило бы if ($_POST['name']) $name = $_POST['name']. Вообще довольно характерный код в стиле "имитация бурной деятельности", выдающий с головой тех, кто учился у Попова. Вообще, если $_POST состоит только из этих трех переменных (name, login, email), все три строки заменяются на extract($_POST).
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Roma_SP, расскажи своими словами как ты понимаешь этот поповский фрагмент. почему надо делать именно так? у любого действия должны быть причины.

    смотрю на твой код и буквально каждый абзац вызывет у меня протест ))) в него даже вникать не хочется.
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Код (Text):
    1. if (isset($_POST['name'])) { $name = $_POST['name']; if ($name == '') { unset($name);} }
    2. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
    3. if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} }
    Вот по логике вещей, это должна была быть обработка случая, если скрипт вызван не из формы, без данных, или с незаполненными нужными данными. Только unset-ом вы добьётесь только одного - при попытке сделать запрос, php на вас матнётся предупреждением, если ему рот не заткнули, а в базе появится пустая запись. А оно вам надо? Нормальное поведение - если не задано нужных данных, редиректить обратно на форму. Типа такого:
    Код (PHP):
    1. if (empty($_POST['name']) || empty($_POST['login']) || empty($_POST['email'])) {
    2.    header("Location: /register.php");
    3.    die;
    4. }
    Чужой код из любого источника надо не копипастить, а разбирать, что там и зачем делается. Вот вам задание: почитайте, что делает unset, что делает empty, и попробуйте ответить на вопрос, почему я написал именно это.

    P.S. Кстати, сам немного неверно записал, редко pdo пользуюсь. поправил в посте
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    PDO это хорошо, если я правильно понимаю, автор переделал код Попова чтобы вместо функций mysql* использовался pdo mysql. это прекрасно!

    Раз уж PDO, то грех не переписать подстановку параметров на плейхслодеры. Примеры смотри здесь: http://www.php.%6eet/manual/ru/pdo.prepare.php
    Код (PHP):
    1. $sth->execute(array(':calories' => 150, ':colour' => 'red'));