2

現在、MySQL データベースには 5 つのテーブルがあります。それらのいくつかは外部キーを共有し、相互に依存しています。MySQL でクエリをテストしましたが、完璧に動作します。クエリ php を使用すると、データベース PDO 接続でエラーが表示されます。また、意図したとおりに PHP が結果を出力するかどうかもわかりません。この 2 つの問題を解決するにはどうすればよいですか?

PHP

<?

try {

    $pdo = new PDO ("mssql:host=$hostname;dbname=$dbname","$username","$pw");
  } catch (PDOException $e) {
    echo "Failed to get DB handle: " . $e->getMessage() . "\n";
    exit;
  }
      $query = $pdo->prepare("SELECT course.id, major.name, course.name, course.code, course.description, course.hours, semester.semester, semester.year
                            FROM course
                            LEFT JOIN major_course_xref ON course.id = major_course_xref.course_id
                            LEFT JOIN major ON major.id = major_course_xref.major_id
                            LEFT JOIN course_semester_xref ON course.id = course_semester_xref.course_id
                            LEFT JOIN semester ON course_semester_xref.semester_id = semester.id");
      $query->execute();

      foreach ($pdo->query($query) as $row) {
        print $row['id'] . "\t";
        print $row['name'] . "\t";
        print $row['name'] . "\n";
        print $row['code'] . "\n";
        print $row['description'] . "\n";
        print $row['hours'] . "\n";
        print $row['semester'] . "\n";
        print $row['year'] . "\n";
    }

      unset($pdo); 
      unset($query);

?>  

希望の表示:

Computer Engeneering
Visual Studio I
CPE1900
Introduction to disciplined, object-oriented programming
4
Fall
2013

Raysの回答後に更新:これは私が今得たエラーです

Warning: PDO::query() expects parameter 1 to be string

Warning: Invalid argument supplied for foreach() in 
4

3 に答える 3

1

1つは、dsn接続文字列がmysqlではなくmssqlを示していることです。

これにより、mysqlデータベースへの接続の問題が発生します。

これに接続を変更して、再試行してください。

    $pdo = new PDO ("mysql:host=$hostname;dbname=$dbnameU","$username","$pw");
于 2012-11-02T02:27:45.853 に答える
1

PDO prepare メソッドは、新しい PDO ステートメントオブジェクトを作成します。この例で $pdo->query() にパラメーターとして $query を渡すと、クエリ メソッドはパラメーターとして文字列のみを受け入れるため、失敗します。

$pdo->query() と $pdo->prepare() の両方が PDOStatement オブジェクトを返し、そこから結果を取得できます。この 2 つの主な違いは、query() ではステートメントの準備と実行が同時に行われるのに対し、prepare() では実行前にステートメントをさらに変更できることです。どちらも同じメソッドを使用して、実行後に結果をフェッチします。

コードに基づいて、次のいずれかのオプションをお勧めします。

1) $pdo->query($sql) を使用してステートメントを同時に準備および実行します。

$query = $pdo->query($sql);
foreach($query->fetchAll() as $row) {
  //...do something
}

2) ステートメントを個別に準備して実行し、結果を返します。

$query = $pdo->prepare($sql);
$query->execute(); // Note: this returns a boolean, true if successful, false if otherwise.
foreach($query->fetchAll() as $row) {
  //...do something
}

注: この特定のインスタンスでは、PDO::FETCH_ASSOC をパラメーターとして渡すことにより、戻り値の型の内容が現在のコードで機能することを確認できます。

例:

foreach($query->fetchAll(PDO::FETCH_ASSOC) as $row) {
  //..do something
}
于 2012-11-02T03:22:30.440 に答える
0

execute()メソッドはFALSE、エラーの場合、または成功した場合に戻りますTRUE。次に、行を 1 つずつフェッチする必要があります。

参照: http://php.net/manual/en/pdostatement.execute.phpおよびhttp://www.php.net/manual/en/pdostatement.fetch.php

if ($query->execute()){

      while ($row = $query->fetch(PDO::FETCH_ASSOC)){
        print $row['id'] . "\t";
        print $row['name'] . "\t";
        print $row['name'] . "\n";
        print $row['code'] . "\n";
        print $row['description'] . "\n";
        print $row['hours'] . "\n";
        print $row['semester'] . "\n";
        print $row['year'] . "\n";
    }
}
else
    echo 'Could not fetch results.';
于 2012-11-02T03:22:12.037 に答える