Запрос со специальными символами в PHP - PullRequest
0 голосов
/ 24 апреля 2020

У меня проблема с запросами, которые содержат ' в именах.

Выберите HTML:

<select id="list-skins" name = "specific_skins_list[]" multiple="multiple" style="width: 500px">
<?php
     $get_all_skins_list= mysqli_query($conn, "SELECT * FROM skins_list");

     while($row = mysqli_fetch_array($get_all_skins_list)) {
         $skins_name = $row["skins_list"];
         $skins_id = $row["id"];
         $skins_name = str_replace("&#039;", "&rsquo;", $skins_name);
         echo '<option value="'.$skins_name.'">'.$skins_name.'</option>';
     }//END WHILE GET_ALL_REGIONS
 ?>
 </select>

POST

if (isset($_POST["specific_skins_list"])) {
    $query .= "
         AND skins LIKE  '%" . implode("%' or skins LIKE '%", $_POST['specific_skins_list']) ."%'
         ";
}

Моя проблема : в таблице skins_list у меня есть имена вроде:

 i'oan , v'asilivev etc...

Эти имена содержат '.

Запрос работает нормально, если имена нормальные без специальных символов. Я нашел пару решений в моем поиске, чтобы использовать mysqli_real_escape_string.

Я пытался сделать что-то вроде этого:

if (isset($_POST["specific_skins_list"])) {
    $skins = mysqli_real_escape_string($conn,$_POST["specific_skins_list"])   ; 
    $query .= "
         AND skins LIKE  '%" . implode("%' or skins LIKE '%", $skins) ."%'
         ";
}

, но я получаю эту ошибку:

mysqli_real_escape_string () ожидает, что параметр 2 будет строкой, массив задан в ... моей странице

И запрос выглядит так:

SELECT * 
FROM import_acc 
WHERE available = 'YES' AND region = 'UVAS' AND st= 'Truex' AND skins LIKE '%%' " 

Спасибо за ваше время.

PS Думаю, единственный способ исправить это - изменить все таблицы skins_list и добавить manulaly double '' к каждому имени: D

1 Ответ

0 голосов
/ 24 апреля 2020

Вы определили поля как "specific_skins_list []", поэтому он создает массив вместо строки, и поэтому вы получаете ошибку. mysqli_real_escape_string работает только со строками. Самый простой способ решить это - l oop в этом массиве, вызывая mysqli_real_escape_string для каждого элемента, например:

$skins = [];
foreach($_POST["specific_skins_list"] as $skin)
  $skins[] = mysqli_real_escape_string($conn,$skin);

Теперь ваша переменная $ skins содержит правильно отформатированные строки для запроса SQL (возможно, ). Конечно, в реальном скрипте вы должны сделать намного больше проверки - вы должны убедиться, что $ _POST ["specific_skins_list"] определен и действительно является массивом (с использованием isset и is_array), и что каждый элемент является допустимым именем скина или что-то (например, используя preg_match). В противном случае ваш сценарий может вызвать множество ошибок или ваша БД может быть взломана, если кто-то использует сценарий напрямую, минуя ваш пользовательский интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...