Преобразование массива в строку в ... SQLquery и PHP

У меня проблема с 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.

вы пытаетесь преобразовать имя переменной массива, подобное этому $ a1 [], в строку, подобную этой "$ a1 []", или вы хотите преобразовать значения массива в строку

samezedi 30.05.2018 11:44

Этот вопрос довольно запутанный. Вы можете показать нам точное содержание $requestBody и $requestData?

Magnus Eriksson 30.05.2018 11:45

Можете ли вы очистить преобразование массива из вашего примера?

Shohidur Rahman 30.05.2018 11:46

Я отредактировал ясно вопрос и прикрытие

Andy Hui 30.05.2018 11:55

Вам нужно перебрать свой массив, чтобы получить значения, которые вы ищете. Вы не можете просто выполнить сравнение массива в строковом значении вашей таблицы.

Martin 30.05.2018 14:04

если вы хотите, чтобы запрос имел хотя бы одно из значений вашего массива, вы можете использовать: WHERE name in ". implode (',', $ a1) ...

dWinder 30.05.2018 14:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
3 104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Важный! См. Нижнюю часть ответа для оптимального решения!

Как я уже упоминал в своем комментарии, вам придется перебрать ваш массив, чтобы получить различные индексы, которые вы хотели бы использовать для своего поискового запроса. Вы не можете просто разбить массив на строку поиска и надеяться получить результаты, поэтому вы получаете те ошибки, которые получаете.

Чтобы перебрать ваш массив в цикле, мы должны сначала узнать длину массива. Для этого вы можете использовать функцию 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-инъекции, я бы не пошел по этому пути.

Paolo 30.05.2018 16:00

Я придерживался того же подхода, что и его методы. офс. он должен использовать хранимые процедуры и / или дезинфицировать свои входные данные. Однако смысл этого был не в этом.

Martin 30.05.2018 16:59

Что разные в взорваться и взорваться, как я могу решить использовать? Мартин, ваш метод подхода не совсем подходит для моей ситуации, потому что у меня может быть сотня случаев, так что это не лучший способ для меня. Спасибо кстати

Andy Hui 31.05.2018 03:12
explode(); в основном разбивает строку на массив, разрывая точку разделителя, который вы определяете, а затем нацеливается на ваш explode();. implode(); - это в основном противоположное, где вы берете массив и превращаете его в строку, где разделитель - это совместное соединение вашей новой строки. Это проще с примерами, которые довольно легко найти. В w3schools есть несколько очень простых примеров, которые делают использование этих двух функций легко понятным.
Martin 31.05.2018 17:36

Другие вопросы по теме