Добрый вечер коллеги (правда я вам не ровня), как вставить переменные в запрос к базе данных, вроде всё делаю по инструкции но постоянно выбивает ошибку, нужно с переменной (он же массив) получить название таблицы и имя записи PHP: $sth = $pdo->prepare("SELECT * FROM ':tabl' WHERE ':title'"); $sth->execute(array(':tabl'=>$products_data[0], ':title'=>$products_data[1])); $array = $sth->fetch(PDO::FETCH_ASSOC); У меня фантазия закончилась, как быть?
Прочитал и так и не понял как вставить имя таблицы, к примеру есть поле name в таблице, тогда получаем такую конструкцию name = :name, а как быть с именем таблицы? Ведь заранее его имя не известно --- Добавлено --- Хотя бы скажите верен ли такой запрос: PHP: $sth = $pdo->prepare("SELECT * FROM table = :table WHERE product = :product"); $sth->execute(array(':table'=>$products_data[0], ':product'=>$products_data[1])); $array3 = $sth->fetch(PDO::FETCH_ASSOC); он блин тоже не срабатывает (в массиве данные есть, проверил и ни раз)
Как по вашему будет выглядеть готовый запрос? Кстати, почему именно PDO? Чем вас mysqli, например, не устраивает? Для начала.
Никак, я узнал что названия таблиц нельзя подставлять через плейсхолдеры, сейчас юзаю библиотеку Medoo, ну и там не всё так радужно, короче, замутил я какую то фигню а не структуру БД, и теперь просто офигеваю, менять логику времени нет, в переди опять бессонная ночь
Ну, вообще-то можно. Чисто технически. Специального механизма нет. Начните лучше с чего-нибудь попроще. От простого к сложному.
Типо записать php код в бд и потом с этого же скрипт запустить, или использовать функцию для исполнения строки (уже и название забыл), если знаете какой то другой метод то скажите пожалуйста, буду премного благодарен --- Добавлено --- Так все его советуют, типа это круто и так профессионально! Едрён баклан --- Добавлено --- А что там можно названия таблиц подставить с переменных?
Если вы сформулируете задачу немного подробней - какой именно запрос, откуда берутся входные параметры, и как они выглядят, то конечно вам кто-то что-то подскажет. Ну, да, так и есть. Но, подразумевается, что вы уже понимаете SQL. Умеете составлять и отлаживать запросы. И тд --- Добавлено --- Да запросто.
Задача следующая, это не большой магазин, имеется каталоги и из них следуют карточки товара, так вот, для каждого типа товара я использую отдельную таблицу (категория), имена таблиц в своей основе имеют три буквы и три цифры, в данной таблице имеется одно очень важное поле nameProduct, в него записываться уникальный код товара, этот самый код разделён на две части, первая это название текущей таблицы второй код товара, разделены эти имена нижним подчёркиванием, каждая категория имеет ссылку product-card.php?product=acm001_id001, далее product-card.php парсит эту переменную и подключается к соответствующей таблице получает нужный товар, вот от этого я и составил данную конструкцию: PHP: $sth = $pdo->prepare("SELECT * FROM ':tabl' WHERE ':title'"); $sth->execute(array(':tabl'=>$products_data[0], ':title'=>$products_data[1])); $array = $sth->fetch(PDO::FETCH_ASSOC); Ну по крайней мере задумка была именно такая
Это понятно. Дайте набор переменных(имя таблицы, запрашиваемые параметры для условия) Примерный, отлаженный запрос.
Ну вот такой код я составил в самом начале: PHP: /* Парсим поученную строку для нахождения товаров в других таблицах */ $products_data = explode( '_', $page_product ); //Делаю запрос $sth = $pdo->prepare(SELECT * FROM $products_data[0] WHERE 'product' = :product); $sth->execute(array(':product'=> $page_product )); $array = $sth->fetch(PDO::FETCH_ASSOC); return $array; А это сама таблица: Код (Text): acm001 пример таблицы каталога -------------------- id id поле product Уникальное id товара name_product Название товара image Путь до картинки товара description_1 Описание 1 description_2 Описание 2 description_3 Описание 3 description_4 Описание 4 description_5 Описание 5 description_6 Описание 6 rating Рейтинг товара price Цена товара reviews Отзывы о товаре actual Наличие товара Ну а в переменной $page_product будет acm001_id001, где acm001 это имя таблицы а целиком acm001_id001 уникальное id товара => product (главная строка в таблице) Получить надо все строки связанное с этим товаром
Это не совсем то. Зайдите в phpmyadmin в нужную таблицу и выполните там следующий SQL Код (Text): SELECT * FROM `tablename` WHERE `product` = 'product_name' Заменив `tablename` и 'product_name' на свои значения. Убедитесь, что выборка соответствует запросу. Потом скопируйте этот запрос сюда.
Вот пожалуйста: Код (Text): SELECT * FROM `acm001` WHERE `product` = 'acm001_id001' даже картинку прикрепил, запрос реально работает
PHP: <?php $link = mysqli_connect("hostname", "username", "password", "dbname"); mysqli_set_charset($link, 'utf8'); $tablename = 'acm001'; $productname = 'acm001_id001'; $sql = sprintf("SELECT * FROM `%s` WHERE `product` = '%s'", $tablename, $productname); echo '<pre>'; if ($query_result = mysqli_query($link, $sql)) { while ($row = mysqli_fetch_assoc($query_result)) { print_r ($row); } } ?>
Я чуть со смеху не лопнул, примерно такой же код составил и я когда узнал что mysqli можно подставлять переменные, но у меня выбивает ошибку "Unknown column 'acm001_id001' in 'where clause'", спасибо тебе большое, сейчас затесту и отпишусь РАБОТАЕТ ЧЕРТЯГА, агромное, просто вселенское спасибо, может когда нибудь и я дорасту до того чтобы давать делние советы на форумах
и не надо. попахивает от таких желаний. на всякий случай: служебные слова типа "WHERE" или имена поллей или знаки операций тоже нельзя вставить через плейсхолдеры. и это оправданное ограничение! чисто для простоты можно считать, что значения-через-плейсхолдеры автоматически оборачиваются в кавычки. так будет понятно почему они не могут работать. если ты формируешь строку запроса напрямую через катенацию или sprintf, то ты берешь на себя ответственность за безошибочность и безопасность!!! ты сам должен учитывать, что в переменной может быть любой символ и ты можешь получить нежелательный результат. а совет-то был сомнительный пользоваться с осторожностью. будешь безоговорочно копировать с форумов — никогда не дорастёшь до level up