За последние 24 часа нас посетили 17830 программистов и 1657 роботов. Сейчас ищут 1310 программистов ...

Помогите разобраться с PDO

Тема в разделе "PHP и базы данных", создана пользователем ban_zay, 18 май 2018.

  1. ban_zay

    ban_zay Новичок

    С нами с:
    18 май 2018
    Сообщения:
    8
    Симпатии:
    1
    Проблема с insert

    Код (Text):
    1.  $stmt = $pdo->prepare("insert into body_price (price_group, price_item, name) VALUES ( :param_group , :param_item) ");
    2.                         $stmt->bindValue("param_group" , 0, PDO::PARAM_INT);
    3.                         $stmt->bindValue("param_item", 0, PDO::PARAM_INT);
    4.                         $stmt->execute();
    В такую табличку

    Код (Text):
    1. create table body_price
    2. (
    3.     id int not null auto_increment
    4.         primary key,
    5.     price_group int null,
    6.     price_item int null,
    7.     name varchar(250) null,
    8.     constraint body_price_id_uindex
    9.         unique (id),
    10.     constraint body_price_group___fk
    11.         foreign key (price_group) references body_price_group (id),
    12.     constraint body_price_item____fk
    13.         foreign key (price_item) references body_price_item (id)
    14. )
    15. ;
    16.  
    17. create index body_price_group___fk
    18.     on body_price (price_group)
    19. ;
    20.  
    21. create index body_price_item____fk
    22.     on body_price (price_item)
    23. ;
    В price_group и price_item в id есть нули через консоль всё инсертица из php нет.
    Что может быть не так?
     
  2. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    так это, друг, ты двоеточия потерял
    PHP:
    1. $stmt->bindValue(":param_group" , 0, PDO::PARAM_INT);
    первое, что в глаза бросилось
     
  3. ban_zay

    ban_zay Новичок

    С нами с:
    18 май 2018
    Сообщения:
    8
    Симпатии:
    1
    Спасибо, я в общем разобрался, PDO работает иначе в циклах, prepare надо выносить за пределы цикла иначе просто не работает. Всем спасибо, тему можно закрывать.
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @acho, @ban_zay, мне вот первым, что в "глаза бросилось" было несоответствие количества перечисленных колонок таблицы и значений в values...
     
  5. ban_zay

    ban_zay Новичок

    С нами с:
    18 май 2018
    Сообщения:
    8
    Симпатии:
    1
    Всё верно, очепятка... Не нашел как отредактировать пост.
    --- Добавлено ---
    Сделал вот так, всё работает... Может кто подскажет нужно ли использовать closeCursor() с MySQL ?


    PHP:
    1. $stmt_insert = $pdo->prepare("INSERT INTO body_price (price_group, price_item, name) VALUES (:price_group ,:price_item,:name )");
    2. $test_stmt = $pdo->prepare("SELECT  * FROM body_price WHERE price_group = :price_group AND price_item = :price_item");
    3. $stmt_update = $pdo->prepare("UPDATE body_price SET name = :name WHERE price_group = :price_group AND price_item = :price_item ");
    4. $stmt_del = $pdo->prepare("DELETE FROM body_price WHERE price_group = :price_group AND price_item = :price_item ");
    5.  
    6.  
    7. if (isset($_POST['arr_val'])) {
    8.     foreach ($_POST['arr_val'] as $key => $value) {
    9.         $x = $key;
    10.         $y = 0;
    11.         foreach ($value as $str) {
    12.             $test_stmt->execute(array("price_group" => $x, "price_item" => $y));
    13.             if ($test_stmt->rowCount() <= 0) {
    14.                 if (!empty($str)) {
    15.                     $stmt_insert->execute(array("price_group" => $x, "price_item" => $y, "name" => $str));
    16.                     $stmt_insert->closeCursor();
    17.                 }
    18.             } else {
    19.                 $test_row = $test_stmt->fetch(PDO::FETCH_ASSOC);
    20.                 if (empty($str)) {
    21.                     $stmt_del->execute(array("price_group" => $x, "price_item" => $y));
    22.                 } elseif (trim($test_row['name']) != trim($str)) {
    23.                     $stmt_update->execute(array("name" => $str, "price_group" => $x, "price_item" => $y));
    24.                     $stmt_update->closeCursor();
    25.                 }
    26.             }
    27.             $test_stmt->closeCursor();
    28.             $y++;
    29.         }
    30.     }
    31. }