Как я могу правильно использовать объект PDO для параметризованного запроса SELECT

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

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

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

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

Ответ 1

Вы выбираете такие данные:

$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);

Ответ 2

Я работал с 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();

Ответ 3

Вы можете использовать методы 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 say we need the second result, i.e. index of 1
    $row_id = $check[1]['id']; 
    // do something
}

Ответ 4

Ответ на полный бит litle здесь готов для всех:

    $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 connecter, и на основе id из таблицы users мы получаем username, используя fetch();

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

Ответ 5

Метод 1: метод запроса USE 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);

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

Ответ 6

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

//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 />";
}

Ответ 7

точно после строки подгонки добавить ниже код

echo $statement->queryString;