【问题标题】:PHP PDO connection and sql queryPHP PDO连接和sql查询
【发布时间】:2012-10-22 16:58:45
【问题描述】:

我目前在 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 

【问题讨论】:

  • 你得到什么错误信息?
  • 你是否设置了数据库连接变量($hostname;dbname=$dbname","$username","$pw")
  • @TurboJ 我已经添加了错误信息。

标签: php


【解决方案1】:

首先,您的 dsn 连接字符串表示 mssql 而不是 mysql....

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

更改您的连接并重试:

    $pdo = new PDO ("mysql:host=$hostname;dbname=$dbnameU","$username","$pw");

【讨论】:

  • +1 谢谢,它部分解决了问题,现在我遇到了另一个错误。检查我发布的问题以获取更新。
【解决方案2】:

PDO 准备方法创建一个新的 PDO 语句object。在您的示例中将 $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
}

【讨论】:

    【解决方案3】:

    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.';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2011-09-21
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多