2016-05-09 12 views
-1

私のSQLiteのクエリは、このように書き:クエリの結果をPHP配列に格納して処理する方法は? PHPで

function getTableData($l_name) { 
    $db = new PDO("sqlite:../db/mydb.sqlite"); 
    $results = $db->exec("SELECT * FROM Locations WHERE L_ID = '" . $l_name; . "');"; 
    ....... 
} 

私の質問は以下のとおりです。

  • 私は$resultsに基づいて位置の配列を取得できますか?最初と最後のレコードをそれぞれ参照するのに、$results[0]または$results[$results.length]と書くことができますか?
  • foreachループを使用してすべてのレコードをループするにはどうすればよいですか? foreach ($results as $record)がありますか?$recordは、現在の反復でLocationの単一レコードになっていますか?
  • 個々のレコードへの参照を持っている場合は、records[0]のような配列を使用すると、このレコードのフィールド(L_NameやL_IDなど)にどのようにアクセスできますか?

ありがとうございます。すべての

foreach ($db->$query("SELECT * FROM Locations WHERE L_ID = '" . $l_name . "'") as $row) 
{ 
    // $row will contain an array to the current record 
    // Address fields using the field name in quotes inside the brackets next to $row 
    $variable1 = $row['field1name']; 
    $variable2 = $row['field2name']; 
} 
+1

['PDOStatement :: fetchAll()'](http://php.net/manual/en/pdostatement.fetchall.php)のように見えます。 '$ records = $ results-> fetchAll();'を実行することができます。次に、その配列をループすることができます。 'foreach($ records as $ records){$ record ['L_Name']}'、またはそれを直接選択します。 '$ records [0] ['L_Name']' – Sean

答えて

2

まず、あなたのコードだけで間違っている:ここでは

-1

が返されますが、各レコードのフィールドを参照することができ、クエリの結果をループの基本的なコードです。ここでは、適切なバージョン行く:

$opt = [ 
    PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
]; 
$db = new PDO("sqlite:../db/mydb.sqlite", $opt); 
$stmt = $db->prepare("SELECT * FROM Locations WHERE L_ID = ?"); 
$stmt->execute([$l_name]); 

をそして今、あなたはあなたの2番目の質問のための$結果の代わりに$ stmtは変数を使用することができます。

は、どのように私はすべてのレコードをループするforeachループを使用するのでしょうか? foreach($レコードとしての$結果)を持つことができますか?ここで、$ recordは現在の反復でLocationの単一のレコードであるはずです。

はい、可能です。

$stmt = $db->prepare("SELECT * FROM Locations WHERE L_ID = ?"); 
$stmt->execute([$l_name]); 
foreach ($stmt as $row) 
{ 
    // do whatever 
} 

ただし、この方法は他の要件では機能しません。

$結果に基づいて場所の配列を取得するにはどうすればよいですか?最初のレコードと最後のレコードをそれぞれ参照するために$ results [0]または$ results [$ results.length]と書くことができますか?

本当配列を取得するには、PDOStatement::fetchAll()‌​方法を必要としています。しかし、最後の要素を取得するには、構文が異なることになります。私は、個々のレコードへの参照を持っているとしたら

$stmt = $db->prepare("SELECT * FROM Locations WHERE L_ID = ?"); 
$stmt->execute([$l_name]); 
$results = $stmt->fetchAll(); 
$first = $results[0]; 
$last = $results[count($results)-1]; 

foreach ($results as $row) 
{ 
    // do whatever 
} 

は、このレコードが[0]のような配列を使用して言う、私はどのようにアクセスしますこのレコードのフィールド(L_NameやL_IDなど)?

ちょうど参照してください。あなたが行を取得するときはいつでも、あなたがこのよう

echo $row['L_name']; 
2

PDO::execその要素に対処することができますが、クエリによって返される結果セットを受信しません。あなたが望むのはPDO::queryメソッドまたはPDO::prepareメソッドのいずれかを使用することです。どちらもPDOStatementとなります。

$statement = $dbh->prepare("SELECT * FROM Locations WHERE L_ID = :id"); 
$statement->bindParam(':id', $l_name); 
$statement->execute(); 

// Traverse the result set 
while ($row = $statement->fetch()) { 
    // Do something with each $row here 
} 

// Alternatively, you can load all results into an array: 
$results = $statement->fetchAll(); 

はまた、上記の例は、クエリを使用して変数を使用するPDOStatement::bindParamを使用していることに気づく:それでターンはあなたのような何かをすることができ、トラバース可能です。これはSQLインジェクション攻撃を防ぐために不可欠です。詳しくは、こちらをご覧ください:http://php.net/manual/en/security.database.sql-injection.php

関連する問題