LIKE оператор и специальные символы в PDO / PHP - PullRequest
3 голосов
/ 28 апреля 2010

Я уже проверил ответы на такие вопросы, как этот (Как создать параметризованный запрос PDO с помощью оператора LIKE в PHP) . Я пришел к этому решению:

$sql  = "SELECT count(*) ".
        "FROM mytable ".
        "WHERE num_certif LIKE CONCAT('%',:val,'%')";
$valeur = 'azert';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':val', $val);

Это работает, но вот моя проблема: как мне обработать символ '% '? (т.е. $ valeur = '%'; возвращает все строки)?

Ответы [ 5 ]

4 голосов
/ 28 апреля 2010

Вам нужно экранировать символ%,

  $valeur = '\%';
2 голосов
/ 13 декабря 2012

Примечание для пользователей PostgreSQL ... вместо функции CONCAT вы можете использовать

   SELECT count(*)
   FROM mytable
   WHERE num_certif LIKE '%' || :val || '%'
0 голосов
/ 24 декабря 2013

Я использовал что-то очень простое, как это:

    $select_str = "SELECT * FROM table_x WHERE text_field LIKE '%".$value."%'";

    $StHandler = $this->dbHandler->prepare($select_str);
    $StHandler->execute();

Вы можете использовать только один% в зависимости от того, что вы ищете. Например, если вы хотите, чтобы оно начиналось с вашего значения, а потом содержало какие-либо символы, вы будете использовать '". $ Value."%' "

Надеюсь, это поможет

0 голосов
/ 15 сентября 2012

Я добился этого, используя функции сравнения строк:

WHERE INSTR(LCASE(num_certif),LCASE(:val))>0

Я подозреваю, что производительность пострадает.

0 голосов
/ 08 декабря 2010

Чтобы избежать необходимости собственного экранирования, экранирование должно быть частью данных, которые защищает pdo, а именно связанных аргументов. Он не защищает вас от чего-либо в жестко закодированном запросе.

$sql  = "SELECT count(*) ".
    "FROM avs_souscript ".
    "WHERE num_certif =\"\" ".
    "AND date_annul=\"\" ".
    "AND user=:sess_user ".
    "AND user!=\"\" ".
    "AND num_certif LIKE :num_certif_search";
$valeur = 'azert'; //I assume this actually came from some user input
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':num_certif_search', '%'.$valeur.'%');

(или альтернативно вы можете поместить их в присваивание $valuer = "%{$userInput}%";, так или иначе, они должны быть в связанном аргументе, а не в sql.

Перемещение этого фрагмента глупой строки concat из sql в php также является хорошей практикой для создания масштабируемого приложения. Масштабировать ферму веб-серверов гораздо проще, чем масштабировать сервер базы данных.

...