1行を返すPHP PDO


113

更新2:

これは、取得できる最も最適化されたものですか?

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

更新1:

SQLクエリに制限を追加できることはわかっていますが、不要なforeachループも削除したいと思います。

元の質問:

「foreach」セクションのため、データベースから多くの行を返すのに適した次のスクリプトがあります。

データベースから常に1行しか取得しないことがわかっている場合、これをどのように最適化すればよいですか。データベースから1行しか取得しないことがわかっている場合、foreachループが必要な理由はわかりませんが、コードを変更する方法はわかりません。

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetchAll();

foreach( $result as $row ) {
    echo $row["figure"];
}

$DBH = null;

2
$STH - $DBH -> prepare$STH = $DBH -> prepareこのページのいくつかの場所にする 必要があり ます。
ルーン

休憩時間に
EgoistDeveloper 2017

回答:


206

フェッチしてください。1行のみ取得します。したがって、foreachループは必要ありません:D

$row  = $STH -> fetch();

例(ty northkildonan):

$dbh = new PDO(" --- connection string --- "); 
$stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); 
$stmt->execute(); 
$row = $stmt->fetch();

12
prepareステートメントで "LIMIT 1"を使用する場合に最も最適化されます。
mjspier

2
見事に、完全な例を挙げてください。上記の例のどこかに行かなければならない1行だけではありません。
andrebruton 2014年

3
@andrebruton$dbh = new PDO(" --- connection string --- "); $stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); $stmt->execute(); $row = $stmt->fetch();
low_rents

2
fetch(PDO::FETCH_ASSOC)キーと値の配列のみが必要な場合は、返された配列を半分にカットします。
rybo111 2015

でも本当に必要なのLIMIT 1UNIQUE値を選択していることを頭に浮かびます。
スーパーキャット

15
$DBH = new PDO( "connection string goes here" );
$STH - $DBH -> prepare( "select figure from table1 ORDER BY x LIMIT 1" );

$STH -> execute();
$result = $STH -> fetch();
echo $result ["figure"];

$DBH = null;

fetchとLIMITを一緒に使用できます。LIMITの効果は、データベースが1つのエントリしか返さないため、PHPが処理するデータは非常に少なくて済みます。フェッチを使用すると、データベースレスポンスから最初の(そして唯一の)結果エントリを取得します。

フェッチタイプを設定することで、さらに最適化できます。http: //www.php.net/manual/de/pdostatement.fetch.phpを参照してください。列名を介してのみアクセスする場合は、番号付き配列にする必要があります。

ORDER句に注意してください。ORDERまたはWHEREを使用して、必要な行を取得します。そうしないと、テーブルの最初の行が常に表示されます。


13

試しましたか:

$DBH = new PDO( "connection string goes here" );
$row = $DBH->query( "select figure from table1" )->fetch();
echo $row["figure"];
$DBH = null;

4
あなたは実際にさらに進んで行うことができます$row = $DBH->query($query)->fetch()['figure']。結果がないためにfetch返されfalseた場合、PHPは無効なキー参照を黙って無視します。queryエラー処理がどのように設定されているかに応じて、何かがうまくいかない場合は、例外がスローされるか(私の意見では)、Invalid object method reference "fetch" on "false"....エラーが発生します。クエリは明らかに失敗しました。
kael 16


8

PDOを使用したユーザー入力に基づくデータベースSELECTクエリに対してこれを試すことができます。

$param = $_GET['username'];

$query=$dbh->prepare("SELECT secret FROM users WHERE username=:param");
$query->bindParam(':param', $param);
$query->execute();

$result = $query -> fetch();

print_r($result);

3
私はあなたが悪い日仲間を持っているか、あなたのプロフィールを目立たせようとしているだけだと思います。私の答えは、PDOクエリでSELECT関数の変数を使用する同じシナリオで裏付けられます。私はあなたの日(そして私のもの)を作るためだけに私の回答からSQLインジェクションのコメントを削除します。
user3162468 2014年

4

limit 0,1mysqlの最適化に使用するのはどうですか

そしてあなたのコードについて:

$DBH = new PDO( "connection string goes here" );

$STH - $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH ->fetch(PDO::FETCH_ASSOC)

echo $result["figure"];

$DBH = null;

3

StevenがfetchColumnを使用するように提案したおかげで、コードから1行短くすることをお勧めします。

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.