Параметризованное предложение IN в подготовленном операторе с использованием MySql, PHP и ADODB

Я пишу SQL и использую AdoDb для подключения к моей базе данных, выполнения запросов и так далее. Я использую параметризованные запросы и столкнулся с проблемой.

Это способ передать массив значений в in_clause в AdoDb/MySql для параметризации.

Моя проблема в том, что если я передаю подготовленную строку в качестве параметра, т.е. 'test','test2','test3', она не работает, так как библиотека или база данных автоматически экранирует ее и добавляет внешние кавычки в начинаются и заканчиваются, поэтому все внутренние кавычки затем автоматически экранируются, поэтому запрос ничего не возвращает, поскольку он ищет '\'test\',\'test2\',\'test3\'', а не чем я его кормил.

ОБНОВЛЕНО ДРУГИМ ВОЗМОЖНЫМ СПОСОБОМ ЭТОГО ВЫПОЛНЕНИЯ

<?php
$in_clause = implode(",", $first_names);

$query = "
SELECT    
    mytable_id_pk
FROM 
    mytable
WHERE
FIND_IN_SET(mytable_fname," . $DB->Param('first_names') . ")"

$stmt = $DB->Prepare($query);

$result = $DB->Execute($stmt,array($in_clause));
?>

person jiraiya    schedule 22.05.2012    source источник


Ответы (2)


Я бы сделал это так (поскольку я какое-то время гуглил, и гугл ничего полезного не нашел):

$count = count($first_names);
$in_params = trim(str_repeat('?, ', $count), ', ');

$query = "
SELECT    
    mytable_id_pk
FROM 
    mytable
WHERE
    mytable_fname IN ({$in_params});";

$stmt = $DB->Prepare($query);
$result = $DB->Execute($stmt, $first_names);

Это должно сделать это...

person shadyyx    schedule 22.05.2012
comment
Спасибо за это, я сам думал о чем-то подобном. Я также наткнулся на другое решение, которое сработало хорошо, я обновлю вопрос выше. Еще раз спасибо, я ценю это. - person jiraiya; 22.05.2012
comment
Спасибо, я использую этот способ - person Dibish; 27.02.2014

Сначала несколько советов:

  1. Пожалуйста, внимательно прочитайте документацию AdoDB по подготовленным операторам.
  2. Никогда не включайте ; в строках запроса SQL.

Вы можете попробовать что-то вроде этого:

$question_marks = substr(str_repeat('?,', count($first_names)), 0, -1);

$query = "SELECT mytable_id_pk FROM mytable WHERE mytable_fname IN (" . $question_marks . ")";
$stmt = $DB->Prepare($query);
$result = $DB->Execute($stmt,$first_names);

ВНИМАНИЕ: я не проверял это (здесь нет установки MySQL).

person dezso    schedule 22.05.2012
comment
Почему бы не поставить точку с запятой? Мне любопытна причина, поскольку я использую точки с запятой в конце каждого запроса к mysql в течение многих лет... Я понимаю, что при переходе на другую СУБД мне придется восстанавливать каждый запрос, но есть ли другая разумная причина? - person shadyyx; 22.05.2012
comment
@shadyyx Ну, с mysqli_multi_query вы, конечно, можете ставить точки с запятой. С другой стороны, в mysql_query doc прямо сказано: 'Строка запроса не должна заканчиваться точкой с запятой'. Точная причина этого запрета неясна (не только мне, как я убедился в недавнем гуглении ). Однако это совершенно бесполезно и отрицательно влияет на читабельность (хорошо, это довольно субъективно...) - person dezso; 22.05.2012
comment
спасибо за вклад. Я действительно читал документацию adodb, я на самом деле искал информацию по этому вопросу, но ее не было, поэтому я задал вопрос, чтобы узнать, есть ли какие-либо другие инновационные способы. - person jiraiya; 22.05.2012