web-dev-qa-db-ja.com

パラメーター化されたSELECTクエリにPDOオブジェクトを適切に使用するにはどうすればよいですか

SELECTクエリを実行するためのPHP.netの指示に従ってみましたが、これを実行する最善の方法はわかりません。

パラメータ化されたSELECTクエリを使用して、可能であれば、IDフィールドがパラメータに一致するテーブルでnameを返したいと思います。これは一意であるため、1つのIDを返す必要があります。

次に、そのIDを別のテーブルのINSERTに使用したいので、成功したかどうかを判断する必要があります。

また、再利用のためにクエリを準備できることを読みましたが、これがどのように役立つかはわかりませんでした。

85
Joe Phillips

次のようなデータを選択します。

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

私は最近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();
16
SmashCode

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
}
12
Gillian Lo Wong

少しだけ完全な答えがここにあります。

    $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に基づいてfetch();を使用してusernameを取得します

これが誰かのお役に立てば幸いです!

6
Domuta Marcel

方法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);

これをもっと詳しく知りたい link

3
Sudhir