Использовать подготовленные операторы PHP для Postgres - PullRequest
9 голосов
/ 08 августа 2009

Этот вопрос аналогичен этому "Когда не использовать подготовленные операторы?" , но с частью "как сделать" и для PostgreSQL.

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

Я хотел бы получить конкретные примеры о следующем предложении

Посмотрите на приведение типов, проверку и дезинфекцию переменных и использование PDO с подготовленными утверждениями.

Я знаю, что он имел в виду, проверяя и дезинфицируя переменные. Однако я не совсем уверен в подготовленных заявлениях. Как мы готовим заявления? По фильтрам, то есть по дезинфекции? Или каким-то слоем PDO? Какое определение для слоя?

Что означают подготовленные высказывания в заявлении? Пожалуйста, используйте конкретные примеры.

Ответы [ 4 ]

6 голосов
/ 08 августа 2009

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

Вместо того, чтобы помещать переменную в sql, вы используете маркер именованного или вопросительного знака, для которого будут подставлены реальные значения при выполнении инструкции.

Определение PDO из руководства по PHP:
«Расширение PHP Data Objects (PDO) определяет легкий согласованный интерфейс для доступа к базам данных в PHP».

См. Руководство php по PDO и PDO :: prepare .

Пример подготовленного оператора с именованными маркерами:

<?php
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432');

$sql = "SELECT username, password
FROM users
WHERE username = :username
AND password = :pass";

$sth = $pdo->prepare($sql);
$sth->execute(array(':username' => $_POST['username'], ':pass' => $_POST['password']));
$result = $sth->fetchAll();

Пример подготовленного утверждения с маркерами вопросительного знака:

<?php
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432');

$sql = "SELECT username, password
FROM users
WHERE username = ?
AND password = ?";

$sth = $pdo->prepare($sql);
$sth->execute(array($_POST['username'], $_POST['password']));
$result = $sth->fetchAll();
5 голосов
/ 08 августа 2009

Что означают подготовленные заявления заявление?

Из документации :

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

См. pg_prepare

Пример со страницы, указанной выше:

<?php
// Connect to a database named "mary"
$dbconn = pg_connect("dbname=mary");

// Prepare a query for execution
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');

// Execute the prepared query.  Note that it is not necessary to escape
// the string "Joe's Widgets" in any way
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));

// Execute the same prepared query, this time with a different parameter
$result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes"));
?>

Документация MySQL для подготовленных операторов приятно отвечает на следующие вопросы:

  • Зачем использовать готовые заявления?
  • Когда вы должны использовать подготовленный заявления?
0 голосов
/ 08 августа 2009

Ответ на ответ Карима79

Это

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = $1');

, кажется, такой же, как этот

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = ?');

Вывод: использование pg_prepare и pg_execute делает PHP намного более эффективным, так как вам не нужно рассматривать санацию. Это также поможет вам в использовании PDO.

0 голосов
/ 08 августа 2009

Как мы готовим заявления:

Вы определяете запрос один раз и можете вызывать его столько раз, сколько хотите, с разными значениями. (например, в цикле)

$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));
$result = pg_execute($dbconn, "my_query", array("row two"));
$result = pg_execute($dbconn, "my_query", array("row three"));

см .: http://us2.php.net/manual/en/function.pg-execute.php

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