За последние 24 часа нас посетили 21918 программистов и 995 роботов. Сейчас ищет 671 программист ...

Как вставить переменные в запрос к базе данных

Тема в разделе "PHP и базы данных", создана пользователем primitiv, 14 мар 2021.

  1. primitiv

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

    С нами с:
    22 ноя 2018
    Сообщения:
    40
    Симпатии:
    0
    Добрый вечер коллеги (правда я вам не ровня), как вставить переменные в запрос к базе данных, вроде всё делаю по инструкции но постоянно выбивает ошибку, нужно с переменной (он же массив) получить название таблицы и имя записи

    PHP:
    1. $sth = $pdo->prepare("SELECT * FROM ':tabl' WHERE ':title'");
    2.     $sth->execute(array(':tabl'=>$products_data[0], ':title'=>$products_data[1]));
    3.     $array = $sth->fetch(PDO::FETCH_ASSOC);
    У меня фантазия закончилась, как быть?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
  3. primitiv

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

    С нами с:
    22 ноя 2018
    Сообщения:
    40
    Симпатии:
    0
    Прочитал и так и не понял как вставить имя таблицы, к примеру есть поле name в таблице, тогда получаем такую конструкцию name = :name, а как быть с именем таблицы? Ведь заранее его имя не известно
    --- Добавлено ---
    Хотя бы скажите верен ли такой запрос:

    PHP:
    1.     $sth = $pdo->prepare("SELECT * FROM table = :table WHERE product = :product");
    2.     $sth->execute(array(':table'=>$products_data[0], ':product'=>$products_data[1]));
    3.     $array3 = $sth->fetch(PDO::FETCH_ASSOC);
    он блин тоже не срабатывает (в массиве данные есть, проверил и ни раз)
     
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Как по вашему будет выглядеть готовый запрос?
    Кстати, почему именно PDO?
    Чем вас mysqli, например, не устраивает? Для начала.
     
  5. primitiv

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

    С нами с:
    22 ноя 2018
    Сообщения:
    40
    Симпатии:
    0
    Никак, я узнал что названия таблиц нельзя подставлять через плейсхолдеры, сейчас юзаю библиотеку Medoo, ну и там не всё так радужно, короче, замутил я какую то фигню а не структуру БД, и теперь просто офигеваю, менять логику времени нет, в переди опять бессонная ночь
     
  6. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Ну, вообще-то можно. Чисто технически. Специального механизма нет.
    Начните лучше с чего-нибудь попроще.
    От простого к сложному.
     
  7. primitiv

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

    С нами с:
    22 ноя 2018
    Сообщения:
    40
    Симпатии:
    0
    Типо записать php код в бд и потом с этого же скрипт запустить, или использовать функцию для исполнения строки (уже и название забыл), если знаете какой то другой метод то скажите пожалуйста, буду премного благодарен
    --- Добавлено ---
    Так все его советуют, типа это круто и так профессионально! Едрён баклан
    --- Добавлено ---
    А что там можно названия таблиц подставить с переменных?
     
  8. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Если вы сформулируете задачу немного подробней - какой именно запрос, откуда берутся входные параметры, и как они выглядят, то конечно вам кто-то что-то подскажет.
    Ну, да, так и есть. Но, подразумевается, что вы уже понимаете SQL.
    Умеете составлять и отлаживать запросы. И тд
    --- Добавлено ---
    Да запросто.
     
  9. primitiv

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

    С нами с:
    22 ноя 2018
    Сообщения:
    40
    Симпатии:
    0
    Задача следующая, это не большой магазин, имеется каталоги и из них следуют карточки товара, так вот, для каждого типа товара я использую отдельную таблицу (категория), имена таблиц в своей основе имеют три буквы и три цифры, в данной таблице имеется одно очень важное поле nameProduct, в него записываться уникальный код товара, этот самый код разделён на две части, первая это название текущей таблицы второй код товара, разделены эти имена нижним подчёркиванием, каждая категория имеет ссылку product-card.php?product=acm001_id001, далее product-card.php парсит эту переменную и подключается к соответствующей таблице получает нужный товар, вот от этого я и составил данную конструкцию:

    PHP:
    1.     $sth = $pdo->prepare("SELECT * FROM ':tabl' WHERE ':title'");
    2.     $sth->execute(array(':tabl'=>$products_data[0], ':title'=>$products_data[1]));
    3.     $array = $sth->fetch(PDO::FETCH_ASSOC);
    Ну по крайней мере задумка была именно такая
     
  10. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Это понятно.
    Дайте набор переменных(имя таблицы, запрашиваемые параметры для условия)
    Примерный, отлаженный запрос.
     
  11. primitiv

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

    С нами с:
    22 ноя 2018
    Сообщения:
    40
    Симпатии:
    0
    Ну вот такой код я составил в самом начале:

    PHP:
    1.     /* Парсим поученную строку для нахождения товаров в других таблицах */
    2.     $products_data = explode( '_', $page_product );
    3.     //Делаю запрос
    4.     $sth = $pdo->prepare(SELECT * FROM   $products_data[0]   WHERE 'product' = :product);
    5.     $sth->execute(array(':product'=>  $page_product  ));
    6.     $array = $sth->fetch(PDO::FETCH_ASSOC);
    7.     return $array;
    А это сама таблица:

    Код (Text):
    1.  
    2. acm001  пример таблицы каталога
    3. --------------------
    4. id                           id поле
    5. product                 Уникальное id товара
    6. name_product       Название товара
    7. image                   Путь до картинки товара
    8. description_1        Описание 1
    9. description_2        Описание 2
    10. description_3        Описание 3
    11. description_4        Описание 4
    12. description_5        Описание 5
    13. description_6        Описание 6
    14. rating                   Рейтинг товара
    15. price                     Цена товара
    16. reviews                 Отзывы о товаре
    17. actual                   Наличие товара
    Ну а в переменной $page_product будет acm001_id001, где acm001 это имя таблицы а целиком acm001_id001 уникальное id товара => product (главная строка в таблице)

    Получить надо все строки связанное с этим товаром
     
  12. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Это не совсем то.
    Зайдите в phpmyadmin в нужную таблицу и выполните там следующий SQL

    Код (Text):
    1. SELECT * FROM `tablename` WHERE `product` = 'product_name'
    Заменив `tablename` и 'product_name' на свои значения.
    Убедитесь, что выборка соответствует запросу.
    Потом скопируйте этот запрос сюда.
     
  13. primitiv

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

    С нами с:
    22 ноя 2018
    Сообщения:
    40
    Симпатии:
    0
    Вот пожалуйста:

    Код (Text):
    1. SELECT * FROM `acm001` WHERE `product` = 'acm001_id001'
    даже картинку прикрепил, запрос реально работает
     

    Вложения:

  14. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    PHP:
    1. <?php
    2.  
    3. $link = mysqli_connect("hostname", "username", "password", "dbname");
    4. mysqli_set_charset($link, 'utf8');
    5.  
    6. $tablename = 'acm001';
    7. $productname = 'acm001_id001';
    8.  
    9. $sql = sprintf("SELECT * FROM `%s` WHERE `product` = '%s'", $tablename, $productname);
    10.  
    11. echo '<pre>';
    12.  
    13. if ($query_result = mysqli_query($link, $sql))
    14. {
    15.      while ($row = mysqli_fetch_assoc($query_result))
    16.      {
    17.        print_r ($row);
    18.      }
    19. }
    20.  
    21. ?>
     
    primitiv нравится это.
  15. primitiv

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

    С нами с:
    22 ноя 2018
    Сообщения:
    40
    Симпатии:
    0
    Я чуть со смеху не лопнул, примерно такой же код составил и я когда узнал что mysqli можно подставлять переменные, но у меня выбивает ошибку "Unknown column 'acm001_id001' in 'where clause'", спасибо тебе большое, сейчас затесту и отпишусь

    РАБОТАЕТ ЧЕРТЯГА, агромное, просто вселенское спасибо, может когда нибудь и я дорасту до того чтобы давать делние советы на форумах
     
    #15 primitiv, 15 мар 2021
    Последнее редактирование: 15 мар 2021
  16. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    и не надо. попахивает от таких желаний. на всякий случай: служебные слова типа "WHERE" или имена поллей или знаки операций тоже нельзя вставить через плейсхолдеры. и это оправданное ограничение!
    чисто для простоты можно считать, что значения-через-плейсхолдеры автоматически оборачиваются в кавычки. так будет понятно почему они не могут работать.

    если ты формируешь строку запроса напрямую через катенацию или sprintf, то ты берешь на себя ответственность за безошибочность и безопасность!!! ты сам должен учитывать, что в переменной может быть любой символ и ты можешь получить нежелательный результат.

    а совет-то был сомнительный :) пользоваться с осторожностью. будешь безоговорочно копировать с форумов — никогда не дорастёшь до level up