Я пытаюсь преобразовать строку
$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);, используя это внутри массива.
не будет ли это просто not in (str_replace("'", "", $string))
Почему бы не просто SELECT * FROM name WHERE id NOT IN ( ' . $string . ' ) LIMIT 10?
Или используя подготовленные операторы - stackoverflow.com/questions/907806/…
@Nathan_Sav, так как я использую php, этот метод конфликтует со всеми кавычками, и php выдает ошибку
@GuidoFaecke таким образом по какой-то причине не получает никаких данных
Если вы это сделаете $array = array($string);, вы получите массив с этой строкой в качестве единственного члена. Используйте, например. взорваться или preg_split.






если вы удалите кавычки вокруг идентификатора, предполагая, что столбец 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 На самом деле я все еще изучаю sql и php, ваша точка зрения может быть правдой, и я определенно буду продолжать изучать ее, но этот ответ действительно выполнил свою работу, и я могу получить данные, которые я намереваюсь получить. Но спасибо за ваш ответ! Я также рассмотрю ваш ответ и, надеюсь, узнаю об этом больше.
@RiggsFolley: Нет, он случайно выдает желаемый результат! Проверить: explode("','",$string) приводит к массиву, содержащему ОДИН элемент. Присоединение к нему создаст исходную строку. Даже взрыв на ',' НЕ МОЖЕТ работать, потому что он не поймает ' в начале и конце ввода.
@boppy Да, вы правы, исправлено
Теперь это работает, но взорвать + взорвать с одним и тем же разделителем всегда будет приводить к тому, что конечная строка будет точно входной строкой...
О господи, мне нужно больше кофеина :) Простая поправка, надеюсь, прояснит ситуацию.
Даже NOT IN ( '1', '2', '3' ) будет работать, что вы и получите, если оригинал $string оставить нетронутым и просто вставить, т.е. NOT IN ( $string ) Без всякой шумихи. MySQL просто преобразует запрошенные строковые числа в целые числа, предполагая целочисленный столбец, а затем сравнивает.
Вам нужно экранировать специальные символы в файле implode.