Синтаксический анализ строки из запятых и чисел

#php #mysql #ajax #validation

#php #mysql #ajax #проверка

Вопрос:

Я нашел хороший плагин jQuery. Он отправляет данные на php-сервер в виде 1202,39,2393,29,1,39

Я хочу получить эти данные из post, я знаю, как это сделать.

Моя идея состоит в том, чтобы поместить 1202,39,2393,29,1,39 в строку. затем каким-то образом выполнить цикл по ней.

Итак, я бы вставил $string = '1202,39,2393,29,1,39'; Результат был бы примерно таким

  1202<br>
    39<br>
    2393<br>
    29<br>
    1<br>
    39<br>
  

Для каждого идентификатора в цикле я бы проверил, является ли это допустимым идентификатором. Я знаю, как проверить в MySQL, существует ли что-то. Часть, в которой я не уверен, — это получение каждого идентификатора в цикле из строки, а затем выполнение чего-либо с ним. Это кажется трудным для объяснения, надеюсь, я ясно выразился.

Комментарии:

1. Вы можете просто использовать функцию разнесения: php.net/manual/en/function.explode.php чтобы разделить ее на ,

2. Добавлен mysql тег, потому что это важный фактор в этом вопросе.

Ответ №1:

Вам не следует запускать SQL-запросы в цикле, поэтому я бы сказал, что вам вообще не следует explode() этого делать (что предлагали другие). Это очень плохая практика, потому что если у вас есть 20 идентификаторов, это будет означать 20 вызовов базы данных, что очень, очень неэффективно. Вызовы базы данных должны быть по возможности сведены к минимуму, поскольку они дороги.

Я бы запустил запрос, который возвращает те идентификаторы, которые есть в базе данных.

Ваш запрос будет выглядеть примерно так

  select id from table where id in (YOUR_STRING_ESCAPED)
  

Обязательно экранируйте свой $string first, например, с помощью mysql_real_escape_string() .

Идентификаторы, которые возвращаются из вашего запроса, — это те, которые можно безопасно вывести.

Комментарии:

1. выберите id из учетных записей, где id в 2,8,9,10 дает #1064 — У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘2,8,9,10 LIMIT 0, 30’ в строке 1

2. @Keverw Обратите внимание на () вокруг строки.

3. Ох. Я думал, вы просто вставили это, чтобы показать переменную. Спасибо! Мое приложение будет использовать как этот метод, так и метод цикла. Один из них предназначен для проверки при сохранении на черновик, другой будет использоваться для вставки в почтовый ящик каждого пользователя.

4. @Keverw Если insert in to each users mailbox вы имеете в виду вызовы SQL INSERT , вам также не следует вызывать их из цикла. INSERT поддерживает вставку нескольких записей одним вызовом.

Ответ №2:

Чтобы разбить строку на отдельные части, используйте explode:

 $string = '1202,39,2393,29,1,39'; 
$list = explode(",", $string);
  

Затем вы могли бы делать с массивом все, что захотите, например

 foreach ($list as $item)
{
    print $item."<br>";
}
  

Ответ №3:

Используйте explode() first для создания массива:

 $string = '1202,39,2393,29,1,39';
$array= explode(",", $string);
  

Затем используйте foreach цикл для выполнения ваших проверок:

 foreach ($array as amp;$value) {
    if($value == etc.....//perform your checks here.
}
  

Комментарии:

1. Это проблема с вопросами по софтболу. Я новичок в SO и разрываюсь между ответами на множество простых вопросов или на несколько сложных. Несколько часов назад я написал подробный ответ на проблему, и вопрос был удален менее чем за минуту до того, как я опубликовал. *sob*

2. Это просто кажется вопросом софтбола… Мне было интересно, что все предлагают запускать SQL-запросы в цикле.

Ответ №4:

 $string = '1202,39,2393,29,1,39';
$array = explode(',', $string);
for($i=0;$i<count($array);$i  ) {
    $sql = "CHECK FOR VALID ID WHERE id=" . $array[$i];
}
  

Это должно заставить вас проверять все эти идентификаторы с помощью sql по отдельности.

Ответ №5:

Предполагая, что вы используете PHP:

 $string = '1202,39,2393,29,1,39';
$data = explode(",", $string);
echo "<pre>"; print_r($data); echo "</pre>"

// Outputs:
// Array
// (
//     [0] => 1202
//     [1] => 39
//     [2] => 2393
//     [3] => 29
//     [4] => 1
//     [5] => 39
// )

// Then you can iterate through the array
foreach ($data AS $value) {
  // Validate the $value
}