У меня проблема с SQL-запросом с массивом в предложении WHERE. Пример: У меня есть несколько примеров массива ниже
$a1[0] = "1"
$a1[1] = "2"
$a1[2] = "3"
PHP, инструкция SQL. Я использую file_get_contents и json_decode для запроса данных массива.
$requestBody = file_get_contents("php://input");
$requestData = json_decode($requestBody,true);
if ($requestData){
$invoice_no = $requestData["$a1[]"];
}
$sqlQuery = "SELECT * FROM table WHERE name = '" . $a1[]. "'";
если у моего массива есть сто значений, как я могу переключить массив на строку, чтобы выполнить мой код? У меня есть ошибка (Преобразование массива в строку ..) в предложении WHERE.
Этот вопрос довольно запутанный. Вы можете показать нам точное содержание $requestBody и $requestData?
Можете ли вы очистить преобразование массива из вашего примера?
Я отредактировал ясно вопрос и прикрытие
Вам нужно перебрать свой массив, чтобы получить значения, которые вы ищете. Вы не можете просто выполнить сравнение массива в строковом значении вашей таблицы.
если вы хотите, чтобы запрос имел хотя бы одно из значений вашего массива, вы можете использовать: WHERE name in ". implode (',', $ a1) ...






Важный! См. Нижнюю часть ответа для оптимального решения!
Как я уже упоминал в своем комментарии, вам придется перебрать ваш массив, чтобы получить различные индексы, которые вы хотели бы использовать для своего поискового запроса. Вы не можете просто разбить массив на строку поиска и надеяться получить результаты, поэтому вы получаете те ошибки, которые получаете.
Чтобы перебрать ваш массив в цикле, мы должны сначала узнать длину массива.
Для этого вы можете использовать функцию PHP count();.
Вот так,
//$a being the name of your array
$length=count($a);
Я сделаю это путем создания SQL с предложением where. Затем я создам еще один SQL, который я объединю с предыдущим SQL, где я затем буду перебирать массив, чтобы получить каждый индекс с помощью оператора OR, чтобы получить каждый результат, где есть совпадения.
Полный пример:
<?php
$a[0] = 1;
$a[1] = 2;
$a[2] = 3;
$a[3] = 4;
$length=count($a);
$i=0;
$sql = "SELECT * FROM table_name WHERE ";
while($length > $i)
{
$sql . = "name='$a[$i]' ";
if ($i+1 < $length)
{
$sql .= "OR ";
}
$i=$i+1;
}
echo $sql;
?>
Выходы:
SELECT * FROM table_name WHERE name='1' OR name='2' OR name='3' OR name='4'
Надеюсь, это было полезно.
Существуют также другие способы обхода массива, например foreach, где вы также можете использовать ключи.
Проведя небольшое исследование, я пришел к выводу, что наиболее оптимальный запрос, который вы можете выполнить в ситуации, когда у вас есть сотни экземпляров, - это использовать WHERE IN() в SQL.
Чтобы добиться этого, нам нужно будет выполнить implode();, который является функцией PHP, которая будет принимать ваш массив и преобразовывать его в строку. Это работает следующим образом: вы объявляете разделитель в вашем implode();, и он становится объединенным соединением ваших индексов массива в строке. В качестве примера:
implode(', ', $a);
Это разделит ваш массив и создаст следующую строку: «1, 2, 3, 4».
Другими словами, мы преобразуем ваш массив в строку, которая соответствует синтаксису функции IN() в SQL.
Тогда ваш запрос будет выглядеть так:
$sqlQuery = "SELECT * FROM table WHERE name IN('" . implode( "', '", $a ) . "')";
Противоположностью implode(); будет explode();, где вы берете строку и превращаете ее в массив с использованием разделителя. Тот же подход, что и с функцией implode();.
вы можете просто использовать $sqlQuery = "SELECT * FROM table WHERE name IN ('" . implode( "','", $a ) . "')";, но поскольку это (и ваше решение) подвержено SQL-инъекции, я бы не пошел по этому пути.
Я придерживался того же подхода, что и его методы. офс. он должен использовать хранимые процедуры и / или дезинфицировать свои входные данные. Однако смысл этого был не в этом.
Что разные в взорваться и взорваться, как я могу решить использовать? Мартин, ваш метод подхода не совсем подходит для моей ситуации, потому что у меня может быть сотня случаев, так что это не лучший способ для меня. Спасибо кстати
explode(); в основном разбивает строку на массив, разрывая точку разделителя, который вы определяете, а затем нацеливается на ваш explode();. implode(); - это в основном противоположное, где вы берете массив и превращаете его в строку, где разделитель - это совместное соединение вашей новой строки. Это проще с примерами, которые довольно легко найти. В w3schools есть несколько очень простых примеров, которые делают использование этих двух функций легко понятным.
вы пытаетесь преобразовать имя переменной массива, подобное этому $ a1 [], в строку, подобную этой "$ a1 []", или вы хотите преобразовать значения массива в строку