#mysql
#mysql
Вопрос:
У меня есть ORDER_TABLE для хранения всего ПОРЯДКА ( order_id , order_name)
В ТАБЛИЦЕ ORDER_ITEMS_TABLE хранятся все элементы каждого порядка ( order_item_id , order_id, item_name ). Каждая строка является элементом, а порядок имеет много строк в ORDER_ITEMS_TABLE
У меня есть входные данные, которые позволяют пользователю вводить список элементов, разделенных запятой (item1, item2, item3), и когда пользователь отправляет, я должен получить все заказы из ORDER_TABLE, которые содержат все элементы выше (item1 И item2 И item3)
Помогите мне, пожалуйста
Ответ №1:
Убедитесь, что вы проанализировали пользовательский список элементов, разделенных запятыми, прежде чем добавлять его в запрос, иначе вы оставите себя открытым для атак SQL-инъекций.
SELECT ot.order_name, oit.item_name
FROM ORDER_ITEMS_TABLE oit
INNER JOIN ORDER_TABLE ot ON ot.order_id = oit.order_id
WHERE oit.order_item_id IN (your,list,of,items)
Комментарии:
1. спасибо за помощь, но мне нужно выбирать заказы, которые содержат все из них, а не какие-либо из них
2. Это немного отличается от исходного вопроса. Вы могли бы использовать запрос, который я вам дал, и сократить результаты на стороне сценариев — я не могу придумать элегантное решение только для SQL для нового вопроса.
Ответ №2:
Чтобы расширить ответ @Crontabs:
$items = $_POST['items'];
$item_array = explode(',',$items);
foreach ($item_array as $item)
{
$item = mysql_real_escape_string($item);
}
$items = implode("','", $item_array);
$query = "SELECT ot.order_name, oit.item_name
FROM ORDER_ITEMS_TABLE oit
INNER JOIN ORDER_TABLE ot ON ot.order_id = oit.order_id
WHERE oit.order_item_id IN ('$items') ";
Теперь вы правильно экранировали эти элементы CSV.
Комментарии:
1. пользователь904427 не пометил его «php», поэтому я не делал никаких предположений. 😉
2. @Crontab, согласно профилю пользователя, он php-пользователь, так что это имело смысл 🙂