Преобразование строки, содержащей запятые, в массив

Я пытаюсь преобразовать строку

$string = "'1', '2', '3'";` 

в массив

$array = array($string);

Это дает мне ошибку при попытке получить данные в MySQL.

SELECT * FROM name WHERE id NOT IN ( '" . implode( "', '" , $array) . "' ) LIMIT 10 

Однако, если я вручную установлю массив как $array = array('1', '2', '3'), он не выдаст ошибку при выборке данных, есть ли способ преобразовать строку в массив, чтобы выборка не выдавала ошибку? Потому что то, что я пытаюсь сделать, это то, что некоторые данные будут переданы в этот файл, где они будут извлечены в виде строки, но позже я хочу преобразовать их в массив. Я также попытался удалить кавычку из строки, и она по-прежнему дает ту же ошибку str_replace('"', "", $string);, используя это внутри массива.

Вам нужно экранировать специальные символы в файле implode.

JoelCrypto 09.05.2022 18:00

не будет ли это просто not in (str_replace("'", "", $string))

Nathan_Sav 09.05.2022 18:02

Почему бы не просто SELECT * FROM name WHERE id NOT IN ( ' . $string . ' ) LIMIT 10?

Guido Faecke 09.05.2022 18:02

Или используя подготовленные операторы - stackoverflow.com/questions/907806/…

Nigel Ren 09.05.2022 18:06

@Nathan_Sav, так как я использую php, этот метод конфликтует со всеми кавычками, и php выдает ошибку

Skoonda 09.05.2022 18:07

@GuidoFaecke таким образом по какой-то причине не получает никаких данных

Skoonda 09.05.2022 18:07

Если вы это сделаете $array = array($string);, вы получите массив с этой строкой в ​​качестве единственного члена. Используйте, например. взорваться или preg_split.

Markus AO 09.05.2022 21:19
Стоит ли изучать 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
7
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

если вы удалите кавычки вокруг идентификатора, предполагая, что столбец id является целочисленным столбцом

$string = "'1', '2', '3'"; 
$string = str_replace("'", '', $string);

$sql = "SELECT * FROM name WHERE id NOT IN ( " . implode(",", explode(',',$string)) . ") LIMIT 10 ";
echo $sql;

РЕЗУЛЬТАТ

SELECT * FROM name WHERE id NOT IN ( 1, 2, 3) LIMIT 10 

Конечно, проще было бы просто сделать

$string = "'1', '2', '3'"; 
$string = str_replace("'", '', $string);
$sql = "SELECT * FROM name WHERE id NOT IN ( $string ) LIMIT 10 ";

Я так не думаю ;) -- implode без второго аргумента приводит к пустому разделителю, поэтому echo implode([1,2,3]); приводит к 123 (НЕТ1,2,3). Но так как $string не содержит разделителя, который вы используете при разнесении (',', но строка содержит ', '), в запросе используется исходная версия $string.

boppy 09.05.2022 18:24

@boppy На самом деле я все еще изучаю sql и php, ваша точка зрения может быть правдой, и я определенно буду продолжать изучать ее, но этот ответ действительно выполнил свою работу, и я могу получить данные, которые я намереваюсь получить. Но спасибо за ваш ответ! Я также рассмотрю ваш ответ и, надеюсь, узнаю об этом больше.

Skoonda 09.05.2022 18:28

@RiggsFolley: Нет, он случайно выдает желаемый результат! Проверить: explode("','",$string) приводит к массиву, содержащему ОДИН элемент. Присоединение к нему создаст исходную строку. Даже взрыв на ',' НЕ МОЖЕТ работать, потому что он не поймает ' в начале и конце ввода.

boppy 09.05.2022 18:34

@boppy Да, вы правы, исправлено

RiggsFolly 09.05.2022 18:36

Теперь это работает, но взорвать + взорвать с одним и тем же разделителем всегда будет приводить к тому, что конечная строка будет точно входной строкой...

boppy 09.05.2022 18:38

О господи, мне нужно больше кофеина :) Простая поправка, надеюсь, прояснит ситуацию.

RiggsFolly 09.05.2022 18:42

Даже NOT IN ( '1', '2', '3' ) будет работать, что вы и получите, если оригинал $string оставить нетронутым и просто вставить, т.е. NOT IN ( $string ) Без всякой шумихи. MySQL просто преобразует запрошенные строковые числа в целые числа, предполагая целочисленный столбец, а затем сравнивает.

Markus AO 09.05.2022 21:28

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