За последние 24 часа нас посетил 16581 программист и 1650 роботов. Сейчас ищут 1940 программистов ...

Проблема с INSERT PDO

Тема в разделе "PHP и базы данных", создана пользователем bogdan_titomir, 23 окт 2017.

  1. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Написал парсер сортировкой осталось только пути в таблицу href вставить. Пути вставляются но все остальные колонки становится типом NULL. Что делать подскажите комрады!
    PHP:
    1. <?php
    2.     $host = '127.0.0.1';
    3.     $db   = 'gigal';
    4.     $user = 'root';
    5.     $pass = '';
    6.     $charset = 'utf8';
    7.     $objectId = '';
    8.     $image = '';
    9.     $row = '';
    10.     $id = '';
    11.     $number_catalog = 1;
    12.  
    13.     $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; // Инициализируем переменные к подключению
    14.  
    15.     $opt = [
    16.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    17.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    18.         PDO::ATTR_EMULATE_PREPARES   => false,
    19.     ];
    20.  
    21.    
    22.     $pdo = new PDO($dsn, $user, $pass, $opt); // Подключаемся через PDO
    23.  
    24.     $stmt = $pdo->query('SELECT * FROM id_images'); // Выбираем каждый блок в таблице id_images
    25.  
    26.     while ($row = $stmt->fetch(PDO::FETCH_LAZY)) // Проходимся циклом и переносим даннные по папкам
    27.     {
    28.         $row_object = $row['objectId'];
    29.         $row_image = $row['image'];
    30.         $id_image = $row['id'];
    31.         $type_image = $row['ext'];
    32.  
    33.         $count_dir = count(glob("../uploads/image/{$number_catalog}/*"));
    34.  
    35.         if($count_dir < 100) {
    36.             $strukture = "../uploads/image/{$number_catalog}/";
    37.             $path = $strukture.$row_object;
    38.             mkdir($strukture,true);
    39.             mkdir($path,true);
    40.             file_put_contents("../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}", $row_image);
    41.             //$href_old = '../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}';
    42.             $pdo->exec("INSERT INTO id_images (href) VALUES ('../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}')");
    43.             /*способ 2 $stmt = $pdo->prepare('INSERT INTO id_images (href) VALUES (:href_old)');
    44.             $stmt->execute(array(':href_old' => $href_old));*/
    45.         } else {
    46.             $number_catalog++;
    47.             mkdir($strukture,true);
    48.             mkdir($path,true);
    49.             file_put_contents("../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}", $row_image);
    50.             //$href_new = '../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}';
    51.             $pdo->exec("INSERT INTO id_images (href) VALUES ('../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}')");
    52.             /*способ 2 $stmt = $pdo->prepare('INSERT INTO id_images (href) VALUES (:href_new)');
    53.             $stmt->execute(array(':href_new' => $href_new));*/
    54.         }
    55.     }
    56. ?>
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.861
    Симпатии:
    751
    Адрес:
    Татарстан
    какие другие колонки то? в таблице id_images?
    Если это новые строки - то нужно задавать все необходимые поля, если эти строки существовали и вы в них добавлять хотите данные по картинкам - то вам update нужно делать с условием

    в том виде что есть - это вообще бред - просто в таблицу вставляются пути картинок .. .никак ни с чем не связанные. Что с ними делать потом - непонятно
     
    #2 ADSoft, 23 окт 2017
    Последнее редактирование: 23 окт 2017
  3. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Да все остальные колонки Nulled становятся но путь к картинке в таблице href прописывается. В остальные строки добавлять ничего не надо там все уже прописано, моя задача в колонку href прописать путь к картинке причем не к 1 картинке их там 60 000 но когда вставляю путь то все колонки порятся и становятся типом NULL Как этого избежать?

    Погуглил оказца в exec нельзя переменные так вставлять только через функцию quote но теперь пишет ситаксическая ошибка.

    Тут идет выборка селектом в цикле и тут же когда он выбирает и сохраняет картинки в папку моя задача выдрать путь и вставить инсертом в колонку href.

    PHP:
    1. <?php
    2.     $host = '127.0.0.1';
    3.     $db   = 'gigal';
    4.     $user = 'root';
    5.     $pass = '';
    6.     $charset = 'utf8';
    7.     $objectId = '';
    8.     $image = '';
    9.     $row = '';
    10.     $id = '';
    11.     $number_catalog = 1;
    12.  
    13.     $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; // Инициализируем переменные к подключению
    14.  
    15.     $opt = [
    16.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    17.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    18.         PDO::ATTR_EMULATE_PREPARES   => false,
    19.     ];
    20.  
    21.  
    22.     $pdo = new PDO($dsn, $user, $pass, $opt); // Подключаемся через PDO
    23.  
    24.     $stmt = $pdo->query('SELECT * FROM id_images'); // Выбираем каждый блок в таблице id_images
    25.  
    26.     while ($row = $stmt->fetch(PDO::FETCH_LAZY)) // Проходимся циклом и переносим даннные по папкам
    27.     {
    28.         $row_object = $row['objectId'];
    29.         $row_image = $row['image'];
    30.         $id_image = $row['id'];
    31.         $type_image = $row['ext'];
    32.  
    33.         $count_dir = count(glob("../uploads/image/{$number_catalog}/*"));
    34.  
    35.         if($count_dir < 100) {
    36.             $strukture = "../uploads/image/{$number_catalog}/";
    37.             $path = $strukture.$row_object;
    38.             mkdir($strukture,true);
    39.             mkdir($path,true);
    40.             file_put_contents("../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}", $row_image);
    41.             //$href_old = '../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}';
    42.             $pdo->exec("INSERT INTO id_images (href) VALUES ('../uploads/image/'.$pdo->quote($number_catalog).'/'.$pdo->quote($row_object).'/'.$pdo->quote($row_image).'.'.$pdo->quote($type_image).'')");
    43.             /*способ 2 $stmt = $pdo->prepare('INSERT INTO id_images (href) VALUES (:href_old)');
    44.             $stmt->execute(array(':href_old' => $href_old));*/
    45.         } else {
    46.             $number_catalog++;
    47.             mkdir($strukture,true);
    48.             mkdir($path,true);
    49.             file_put_contents("../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}", $row_image);
    50.             //$href_new = '../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}';
    51.             $pdo->exec("INSERT INTO id_images (href) VALUES ('../uploads/image/'.$pdo->quote($number_catalog).'/'.$pdo->quote($row_object).'/'.$pdo->quote($row_image).'.'.$pdo->quote($type_image).'')");
    52.             /*способ 2 $stmt = $pdo->prepare('INSERT INTO id_images (href) VALUES (:href_new)');
    53.             $stmt->execute(array(':href_new' => $href_new));*/
    54.         }
    55.     }
    56. ?>
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.861
    Симпатии:
    751
    Адрес:
    Татарстан
    ответы невнимательно читаете
    ... вам нужно UPDATE понимаете? обновлять данные с столбце определенном - а не INSERT - ДОБАВЛЯТЬ новые
     
  5. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Понятно, но ведь href колонка пустая там нет ничего разве не вставлять туда путь к картинке? В общем попробую так как вы говорите попытка не пытка и так массу вариантов перепробовал. Спасибо!
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.861
    Симпатии:
    751
    Адрес:
    Татарстан
    какие попытки.. о чем вы? это ж базовое понимание на человеческом уровне!
    Например если вам в экселе надо в заполненной таблице в какой то столбец внести ИЗМЕНЕНИЯ - вы что строчку всегда добавляете? или идете в существующую строчу и в нужном столбце пишете изменения?
     
  7. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Попробовал через update но цикл while не работает теперь 1 идет вызов на update и все. Моя задача сделать выборку и в конце засунуть путь в href.
    PHP:
    1. <?php
    2.     $host = '127.0.0.1';
    3.     $db   = 'gigal';
    4.     $user = 'root';
    5.     $pass = '';
    6.     $charset = 'utf8';
    7.     $objectId = '';
    8.     $image = '';
    9.     $row = '';
    10.     $id = '';
    11.     $number_catalog = 1;
    12.  
    13.     $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; // Инициализируем переменные к подключению
    14.  
    15.     $opt = [
    16.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    17.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    18.         PDO::ATTR_EMULATE_PREPARES   => false,
    19.     ];
    20.  
    21.  
    22.     $pdo = new PDO($dsn, $user, $pass, $opt); // Подключаемся через PDO
    23.  
    24.     $stmt = $pdo->query('SELECT * FROM id_images'); // Выбираем каждый блок в таблице id_images
    25.  
    26.     while ($row = $stmt->fetch(PDO::FETCH_LAZY)) // Проходимся циклом и переносим даннные по папкам
    27.     {
    28.         $row_object = $row['objectId'];
    29.         $row_image = $row['image'];
    30.         $id_image = $row['id'];
    31.         $type_image = $row['ext'];
    32.  
    33.         $count_dir = count(glob("../uploads/image/{$number_catalog}/*"));
    34.  
    35.         if($count_dir < 100) {
    36.             $strukture = "../uploads/image/{$number_catalog}/";
    37.             $path = $strukture.$row_object;
    38.             mkdir($strukture,true);
    39.             mkdir($path,true);
    40.             file_put_contents("../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}", $row_image);
    41.             $href_old = '../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}';
    42.             $sql = "UPDATE id_images SET href = :href_old WHERE id = :id";
    43.             $stmt = $pdo->prepare($sql);
    44.             $stmt->execute(array(':href_old'=>$href_old, ':id'=>$id));
    45.         } else {
    46.             $number_catalog++;
    47.             mkdir($strukture,true);
    48.             mkdir($path,true);
    49.             file_put_contents("../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}", $row_image);
    50.             $href_new = '../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}';
    51.             $sql = "UPDATE id_images SET href = :href_new WHERE id = :id";
    52.             $stmt = $pdo->prepare($sql);
    53.             $stmt->execute(array(':href_new'=>$href_new, ':id'=>$id));
    54.         }
    55.     }
    56. ?>
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.861
    Симпатии:
    751
    Адрес:
    Татарстан
    по текущему коду - я конечно не вчитываюсь, но думаю что $id у тебя нигде не задано - потому ничего и не обновится
     
  9. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Вот что пишет консоль php:

    Warning: mkdir(): File exists in D:\OpenServer\domains\localhost\parser\index.php on line 40

    Call Stack:
    0.0000 137136 1. {main}() D:\OpenServer\domains\localhost\parser\index.php:0
    0.0770 273264 2. mkdir() D:\OpenServer\domains\localhost\parser\index.php:40

    2 вызова проходит и все до этого было по 10000 вызовов проходило в зависимости от строк в таблице id_images

    PHP:
    1. <?php
    2.     $host = '127.0.0.1';
    3.     $db   = 'gigal';
    4.     $user = 'root';
    5.     $pass = '';
    6.     $charset = 'utf8';
    7.     $objectId = '';
    8.     $image = '';
    9.     $row = '';
    10.     $id = '';
    11.     $number_catalog = 1;
    12.  
    13.     $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; // Инициализируем переменные к подключению
    14.  
    15.     $opt = [
    16.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    17.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    18.         PDO::ATTR_EMULATE_PREPARES   => false,
    19.     ];
    20.  
    21.  
    22.     $pdo = new PDO($dsn, $user, $pass, $opt); // Подключаемся через PDO
    23.  
    24.     $stmt = $pdo->query('SELECT * FROM id_images'); // Выбираем каждый блок в таблице id_images
    25.  
    26.     while ($row = $stmt->fetch(PDO::FETCH_LAZY)) // Проходимся циклом и переносим даннные по папкам
    27.     {
    28.         $row_object = $row['objectId'];
    29.         $id = $row['id'];
    30.         $row_image = $row['image'];
    31.         $id_image = $row['id'];
    32.         $type_image = $row['ext'];
    33.  
    34.         $count_dir = count(glob("../uploads/image/{$number_catalog}/*"));
    35.  
    36.         if($count_dir < 100) {
    37.             $strukture = "../uploads/image/{$number_catalog}/";
    38.             $path = $strukture.$row_object;
    39.             mkdir($strukture,true);
    40.             mkdir($path,true);
    41.             file_put_contents("../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}", $row_image);
    42.             $href_old = '../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}';
    43.             $sql = "UPDATE id_images SET href = :href_old WHERE id = :id";
    44.             $stmt = $pdo->prepare($sql);
    45.             $stmt->execute(array(':href_old'=>$href_old, ':id'=>$id));
    46.         } else {
    47.             $number_catalog++;
    48.             mkdir($strukture,true);
    49.             mkdir($path,true);
    50.             file_put_contents("../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}", $row_image);
    51.             $href_new = '../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}';
    52.             $sql = "UPDATE id_images SET href = :href_new WHERE id = :id";
    53.             $stmt = $pdo->prepare($sql);
    54.             $stmt->execute(array(':href_new'=>$href_new, ':id'=>$id));
    55.         }
    56.     }
    57. ?>
    Думаю что функция Prepare() и Execute() останавливет цикл с селектом.
    --- Добавлено ---
    ../uploads/image/{$number_catalog}/{$row_object}/ В таком виде путь залетает в колонку href. Почему то он не берет значения с переменных $number_catalog и $row_object. Удивительно то что функция file_put_contents в таком виде строку считывала и создавала файлы.
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.861
    Симпатии:
    751
    Адрес:
    Татарстан
    Ну думай..думай
    а лучше все же посмотреть на ошибку - переведи если не понимаешь о чем она
    строки в базу обычно записывают в кавычках
    Код (Text):
    1. "UPDATE id_images SET href = ':href_new' WHERE id = :id";
    а чего ей не создавать то? если путь есть картинка есть....
    а запросы к БД это другое совсем
    --- Добавлено ---
    P/S/ и это не два вызова - не придумывай ерунды
    это стек вызовов в данном случае по факту одного предупреждения
     
    bogdan_titomir нравится это.
  11. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    "Обычно", но не в случае с подготавливаемыми запросами, где плейсхолдеры в строке запроса прописываются без кавычек.
     
  12. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    PHP:
    1. <?php
    2.     $host = '127.0.0.1';
    3.     $db   = 'gigal';
    4.     $user = 'root';
    5.     $pass = '';
    6.     $charset = 'utf8';
    7.     $objectId = '';
    8.     $image = '';
    9.     $row = '';
    10.     $id = '';
    11.     $number_catalog = 1;
    12.  
    13.     $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; // Инициализируем переменные к подключению
    14.  
    15.     $opt = [
    16.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    17.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    18.         PDO::ATTR_EMULATE_PREPARES   => false,
    19.     ];
    20.  
    21.  
    22.     $pdo = new PDO($dsn, $user, $pass, $opt); // Подключаемся через PDO
    23.  
    24.     $stmt = $pdo->query('SELECT * FROM id_images'); // Выбираем каждый блок в таблице id_images
    25.  
    26.     while ($row = $stmt->fetch(PDO::FETCH_LAZY)) // Проходимся циклом и переносим даннные по папкам
    27.     {
    28.         $row_object = $row['objectId'];
    29.         $row_image = $row['image'];
    30.         $id_image = $row['id'];
    31.         $type_image = $row['ext'];
    32.  
    33.         $count_dir = count(glob("../uploads/image/{$number_catalog}/*"));
    34.  
    35.         if($count_dir < 100) {
    36.             $strukture = "../uploads/image/{$number_catalog}/";
    37.             $path = $strukture.$row_object;
    38.             mkdir($strukture,true);
    39.             mkdir($path,true);
    40.             file_put_contents("../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}", $row_image);
    41.             $href_old = '../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}';
    42.             /*
    43.             $sql = "UPDATE id_images SET href = ':href_old'";
    44.             $stmt = $pdo->prepare($sql);
    45.             $stmt->execute(array(':href_old'=>$href_old));
    46.             */
    47.             $pdo->exec("UPDATE id_images SET href = '$href_old'");
    48.         } else {
    49.             $number_catalog++;
    50.             mkdir($strukture,true);
    51.             mkdir($path,true);
    52.             file_put_contents("../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}", $row_image);
    53.             $href_new = '../uploads/image/{$number_catalog}/{$row_object}/{$id_image}.{$type_image}';
    54.             /*
    55.             $sql = "UPDATE id_images SET href = ':href_new'";
    56.             $stmt = $pdo->prepare($sql);
    57.             $stmt->execute(array(':href_new'=>$href_new));
    58.             */
    59.             $pdo->exec("UPDATE id_images SET href = '$href_new'");
    60.         }
    61.     }
    62. ?>
    Получилось прогнать циклом но через exec() только и в href каждая строка зашла но теперь проблема в том что значение переменной не заходит.

    ../uploads/image/{$number_catalog}/{$row_object}/{ - путь
    Должно быть так:
    ../uploads/image/1/6824/568.jpg

    Колонка href VARCHAR 50 длина
     
  13. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    ADSOFT Большое тебе спасибо что помог а то бы я дальше парился с INSERTOM.
    Удалось вывести переменные вместо {$a} использовал '.$a.'

    Еще раз всем спасибо, как закрыть тему?
    --- Добавлено ---
    Модераторы закройте тему пожалуйста.