Как правильно использовать объект PDO для параметризованного запроса SELECT? - PullRequest
85 голосов
/ 20 апреля 2009

Я пытался следовать инструкциям PHP.net для выполнения SELECT запросов, но я не уверен, что лучший способ сделать это.

Я хотел бы использовать параметризованный запрос SELECT, если это возможно, для возврата ID в таблицу, где поле name соответствует параметру. Это должно вернуть один ID, потому что он будет уникальным.

Затем я хотел бы использовать этот ID для INSERT в другой таблице, поэтому мне нужно будет определить, был ли он успешным или нет.

Я также читал, что вы можете подготовить запросы для повторного использования, но я не был уверен, как это поможет.

Ответы [ 6 ]

157 голосов
/ 20 апреля 2009

Вы выбираете данные следующим образом:

$db = new PDO("...");
$statement = $db->prepare("select id from some_table where name = :name");
$statement->execute(array(':name' => "Jimbo"));
$row = $statement->fetch(); // Use fetchAll() if you want all results, or just iterate over the statement, since it implements Iterator

Вы вставляете таким же образом:

$statement = $db->prepare("insert into some_other_table (some_id) values (:some_id)");
$statement->execute(array(':some_id' => $row['id']));

Я рекомендую вам настроить PDO для выдачи исключений при ошибке. Затем вы получите PDOException, если какой-либо из запросов не выполнится - нет необходимости явно проверять. Чтобы включить исключения, вызовите это сразу после создания объекта $db:

$db = new PDO("...");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
16 голосов
/ 03 марта 2013

В последнее время я работаю с PDO, и приведенный выше ответ совершенно верен, но я просто хотел документально подтвердить, что работает следующее:

$nametosearch = "Tobias";
$conn = new PDO("server", "username", "password");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sth = $conn->prepare("SELECT `id` from `tablename` WHERE `name` = :name");
$sth->bindParam(':name', $nametosearch);
// Or sth->bindParam(':name', $_POST['namefromform']); depending on application
$sth->execute();
11 голосов
/ 04 марта 2014

Вы можете использовать методы bindParam или bindValue, чтобы помочь подготовить ваше заявление. С первого взгляда все становится понятнее, а не $check->execute(array(':name' => $name)); Особенно, если вы связываете несколько значений / переменных.

Проверьте ясный, легко читаемый пример ниже:

$q = $db->prepare("SELECT id FROM table WHERE forename = :forename and surname = :surname LIMIT 1");
$q->bindValue(':forename', 'Joe');
$q->bindValue(':surname',  'Bloggs');
$q->execute();

if ($q->rowCount() > 0){
    $check = $q->fetch(PDO::FETCH_ASSOC);
    $row_id = $check['id'];
    // do something
}

Если вы ожидаете несколько строк , удалите LIMIT 1 и измените метод выборки на fetchAll:

$q = $db->prepare("SELECT id FROM table WHERE forename = :forename and surname = :surname");// removed limit 1
$q->bindValue(':forename', 'Joe');
$q->bindValue(':surname',  'Bloggs');
$q->execute();

if ($q->rowCount() > 0){
    $check = $q->fetchAll(PDO::FETCH_ASSOC);
    //$check will now hold an array of returned rows. 
    //let's say we need the second result, i.e. index of 1
    $row_id = $check[1]['id']; 
    // do something
}
6 голосов
/ 19 октября 2013

Небольшой полный ответ здесь со всеми готовыми к использованию:

    $sql = "SELECT `username` FROM `users` WHERE `id` = :id";
    $q = $dbh->prepare($sql);
    $q->execute(array(':id' => "4"));
    $done= $q->fetch();

 echo $done[0];

Здесь $dbh - это соединитель PDO db, и на основе id из таблицы users мы получили username, используя fetch();

Я надеюсь, что это поможет кому-то, Наслаждайтесь!

3 голосов
/ 08 января 2016

Метод 1: ИСПОЛЬЗОВАТЬ метод запроса PDO

$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

Получение количества строк

$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"');
$row_count = $stmt->rowCount();
echo $row_count.' rows selected';

Метод 2: операторы с параметрами

$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?");
$stmt->execute(array($name));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

Метод 3: Параметры привязки

$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?");
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

**bind with named parameters**
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=:name");
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

or
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=:name");
$stmt->execute(array(':name' => $name));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

Хотите узнать больше, посмотрите по этой ссылке

0 голосов
/ 14 ноября 2016

, если вы используете встроенное кодирование на одной странице и не используете упс, чем этот полный пример, это обязательно поможет

//connect to the db
$dbh = new PDO('mysql:host=localhost;dbname=mydb', dbuser, dbpw); 

//build the query
$query="SELECT field1, field2
FROM ubertable
WHERE field1 > 6969";

//execute the query
$data = $dbh->query($query);
//convert result resource to array
$result = $data->fetchAll(PDO::FETCH_ASSOC);

//view the entire array (for testing)
print_r($result);

//display array elements
foreach($result as $output) {
echo output[field1] . " " . output[field1] . "<br />";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...