2

我目前在 MySQL 数据库中有 5 个表。其中一些共享外键并且相互依赖。我已经在 MySQL 中测试了查询,它运行良好。使用查询 php 时,它显示数据库 PDO 连接错误。另外,我不确定我的 PHP 是否会像我想要的那样打印结果。我该如何解决这两个问题?

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

一方面,您的 dsn 连接字符串表示 mssql 而不是 mysql....

这将导致与 mysql 数据库的连接问题。

将您的连接更改为此并重试:

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

PDO 准备方法创建一个新的 PDO 语句对象。在示例中将 $query 作为参数传递给 $pdo->query() 将失败,因为查询方法只接受字符串作为参数。

$pdo->query() 和 $pdo->prepare() 都返回 PDOStatement 对象,您可以从中获取结果。两者之间的主要区别在于 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成功时返回。然后,您需要一次获取一行。

请参阅: http: //php.net/manual/en/pdostatement.execute.phphttp://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 回答