0

mySQL PDO の新機能。ここで他の回答を読み、チュートリアルを読んで、ついに思い切って始めました。問題は、データを出力できないようです。したがって、誰かが私のコードを評価して、それが正しいことを確認できますか? また、データベースのクエリに使用しているシステムは効率的でクリーンで安全ですか? ありがとう

$pdo --- the correct connection information is in this line but has been removed ---
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SELECT sql query
try {
 $thedate='2013-06-03';
 $rotation=1;
 $stmt = $pdo->prepare("SELECT * FROM sched_main_2013 WHERE thedate=:thedate AND rotation=:rotation");
 $stmt->bindValue(':thedate', $thedate, PDO::PARAM_STR);
 $stmt->bindValue(':rotation', $rotation, PDO::PARAM_INT);
 $stmt->execute();
 $stmt->setFetchMode(PDO::FETCH_ASSOC);  
}
catch(PDOException $ex) { 
 echo $ex->getMessage(); 
} 
while($rows = $stmt->fetch()) {  
 echo $rows['thedate'] . "\n";  
 echo $rows[assignedRad] . "\n";  
 echo $rows[rotation] . "\n";  
}

// close the connection
$pdo = null;

このコードは何も出力しません。エラーなし。何もありません。

ところで、テーブルが存在し、手動で mySQL ステートメントを実行すると SELECT * FROM が正常に機能するため、このクエリにはデータが存在します。

4

3 に答える 3

1

あるべき姿

$sql = "SELECT * FROM sched_main_2013 WHERE thedate=? AND rotation=?";
$data = array('2013-06-03', 1);
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
$rows = $stmt->fetchAll();  
var_dump($rows);

$sql = "SELECT * FROM sched_main_2013";
$data = array();
$stmt = $pdo->prepare($sql);
$stmt->execute(array());
$rows = $stmt->fetchAll();  
var_dump($rows);

2 番目のクエリで行が返され、最初のクエリでは返されない場合、データが見つかりません。
両方とも行を返さない場合 -テーブル名から明らかなデータベース設計の誤りが原因であり、このような接尾辞を持つべきではありません

于 2013-06-03T04:27:01.040 に答える
1

あなたはそれvar_dump($row)があなたに与えると言ったFALSEドキュメントには次のように記載されています。

成功時のこの関数の戻り値は、フェッチ タイプによって異なります。いずれの場合も、失敗すると >FALSE が返されます。

次の行を追加します。

while($row = $stmt->fetch()) { 
 echo $row['thedate'] . "\n";  
 echo $row['assignedRad'] . "\n";  
 echo $row['rotation'] . "\n";  
}

if($row === FALSE) {
    var_dump($stmt->errorInfo());
    die();
}

さらに注意してください: の$stmt->fetch() $rows代わりに (複数形)の戻り値に名前を付けました$row。メソッドが呼び出されるたびに単一の行を返すことを知っているかどうかはわかりません。

于 2013-06-03T02:34:46.660 に答える
1

試す

while($rows = $stmt->fetch()) {  
 echo $rows['thedate'] . "\n";  
 echo $rows[assignedRad] . "\n";  
 echo $rows[rotation] . "\n";  
}

while($rows = $stmt->fetch()) {  
 echo $rows['thedate'] . "\n";  
 echo $rows['assignedRad'] . "\n";  
 echo $rows['rotation'] . "\n";  
}

デバッグ 01

たぶん、これを試して、データベースから本当にデータを受け取るかどうかをテストできます

print_r($stmt->fetchAll());

while ループの代わりに


デバッグ 02
たとえば、SQL エラーが発生しないと強く信じている単純なクエリを試してください。

SELECT * FROM sched_main_2013

値バインディングなし。


デバッグ 03

WHERE 条件を使用して別のクエリを試行しますが、バインドは行いません

SELECT * FROM sched_main_2013 WHERE thedate='2013-06-03' AND rotation=1
于 2013-06-03T02:25:14.043 に答える