2017-01-03 3 views
0

Это, наверное, глупый вопрос, но я ответил Googling на большую часть дня и никуда не могу. Я пытаюсь получить следующий код кода для работы, но не могу найти никакой помощи в том, как правильно форматировать подготовленный запрос Postgres в PHP.Переменная в цитатах в запросе Postgres

$foo = $_GET[bar];  

echo $foo; // 5555 

//what I'm trying to do: 
pg_prepare($dbconn,"table_query","SELECT Members FROM programs WHERE programID = '$1' "); 
pg_execute($dbconn,"table_query", array($foo)); 

Если я жестко запрограммировал инструкцию со значением, она работает нормально, но только если я включаю одинарные кавычки. Я пробовал почти каждый метод, который я могу найти, чтобы избежать одиночных кавычек или добавлять кавычки к строке, но все, что я могу получить, - это синтаксический анализ ошибок.

Что совершенно очевидно, что мне не хватает?

Редактировать: Изменен фрагмент, чтобы уточнить, что переменная, которую я получаю, не включает кавычки. Любой метод I, где я пытаюсь добавить кавычки, терпит неудачу.

ответ

0

Вы должны использовать подготовленные операторы. Это должно решить вашу проблему с котировками, а также устранить серьезный риск SQL-инъекции. Попробуйте что-то вроде этого:

$stmt = $conn->prepare("SELECT Members FROM programs WHERE programID = ?"); 
$stmt->bind_param("s", $foo); 

$foo = "5555"; 
$stmt->execute(); 
+0

Поправьте меня, если я ошибаюсь, но я думал, что я уже использовал подготовленное заявление. Должен ли я менять методы? –

+0

@AdamAndrews: AFAIK вы используете подготовленный оператор, потому что ['pg_query_params'] (http://php.net/manual/en/function.pg-query-params.php) представляется очень тонкой оболочкой вокруг PostgreSQL C API, что также означает, что вы свободны от проблем с инъекцией. Не PHP-разработчик, но я бы предположил, что PHP попытается интерполировать этот заполнитель $ 1 в двойной кавычки (следовательно, одиночные кавычки Дарио) и '' $ 1'' является строковым литералом в SQL, тогда как '$ 1' является пронумерованным placeholder (следовательно, некорректный «$ 1» в Dario's). –

+0

Downvoter: Пожалуйста, оставьте комментарий. –

2

Давайте рассмотрим полный пример. Предположим, вы получили свое значение из запроса GET, который задает имя pid. Из вашего примера запроса я ожидаю, что это значение будет десятичным представлением целого числа, отличным от нуля. Это строка, так как ничего другого не может исходить из запроса GET.

$pid = $_GET['pid']; 

// This is _very_ important. 
// Anything that comes from outside must be validated or sanitized. 
// FILTER_VALIDATE_INT refuses "0" too (correct if needed). 
if (filter_var($pid, FILTER_VALIDATE_INT) === false) { 
    // Deal with invalid input 
} 

$result = pg_query_params($dbconn, 
    'SELECT Members FROM programs WHERE programID = $1', 
    array($pid) 
); 

pg_query_params связывает $1 с $pid и цитирует его правильно, в то время как вы не можете использовать двойные кавычки, потому что заявление PHP будет расширяться $1 неправильно. Нет необходимости ставить котировки вокруг $pid вручную, потому что pg_query_params позаботится об этом. Кроме того, PostgreSQL принимает целочисленное значение как с кавычками, так и без них, поэтому возиться с кавычками бессмысленно в этом случае.

Вместо использования традиционных функций pg_ вы можете использовать уровень абстракции объекта базы данных PHP PDO. В этом случае (без учета возможных вариантов, необходимых в вашем случае):

$dsn = 'pgsql:host='. $host .';port=5432;dbname='. $database; 
    $dbh = new PDO($dsn, $user, $password); 
    $dbh->prepare('SELECT Members FROM programs WHERE programID = ?'); 
    $result = $dbh->execute(array($pid)); // $pid as before 
+0

Немного подробное объяснение того, почему вы используете '$ 1', а не ошибочный' '$ 1'' внутри строки SQL, может оказаться полезным и может помочь предотвратить людей, которые не понимают, как работает pg_query_params'. Просто небольшое предложение. –

+0

В вашем примере значение foo уже имеет котировки вокруг него. Моя функция использует GET и рисует значение $ foo без кавычек. Поэтому я думаю, мне нужно перефразировать мой вопрос о том, как правильно добавлять кавычки вокруг значения. Мои попытки преобразовать его в строку и добавить одинарные кавычки, похоже, не сработают. –

+0

@AdamAndrews Я существенно расширил свой ответ. Надеюсь, теперь все ясно. – Dario

Смежные вопросы