【问题标题】:Using PDO connection method使用 PDO 连接方式
【发布时间】:2014-01-26 13:25:48
【问题描述】:

当我第一次开始学习 php 时,我明白将 db 连接文件存储在我的根文件夹中并在每个文件的顶部包含一次是一种很好的做法。这些设置将贯穿整个文件并在函数等内部工作 - 所以同一个文件是存储全局变量的好地方。

现在我终于要更新我的代码/在一个新项目上工作了,我知道 mysql 功能已被贬低,我应该使用 PDO 或 MySQLi。我读到的东西表明,按照 Mysqli 的旧样式执行 while 循环更难,所以我认为 PDO 可能是一个更好的起点。

//例如

while($val = mysql_fetch_array($query)){
    $propertyid = $val['propertyid'];
    $regularid = $val['regularid'];
    $oldamount = str_replace(",", "", $val['amount']);
    $datedue = $val['billdate'];
}

所以我认为最好从 PDO 开始。如果我在它之前包含 $dbh 连接线,则以下内容有效。但是,当我将 $dbh 连接线移动到我的设置文件时,它不会。

$query = $dbh->prepare("SELECT username FROM users");
$query->execute();
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
  print "hi ";
  print $row['username']."<br/>";
}

我知道每个新函数都需要调用连接。我的问题是:

  1. 在数据库连接中添加到每个函数的代码最少的方法是什么
  2. 最好将用户名和密码存储在哪里 - root php? .ini 文件?
  3. 有没有比我一直在使用的“更好”的方法来执行 while 循环...

【问题讨论】:

  • $dbh 存在于全局范围内,因此不会在您的函数中设置,您可以将其作为参数传递给需要它的函数,或使用类似global $dbh;使其可访问。
  • 另外,您可以使用$results = $query-&gt;fetchAll() 并使用foreach 来循环它们,但我不确定这会快多少(如果有的话)。

标签: php mysql pdo mysqli


【解决方案1】:

在迁移到 PDO(它是面向对象的库)时,尝试将您的项目迁移到相同的编码方式 - 面向对象的范例。

您可以构建的简单架构是:

  • 建立 PDO 连接的类(即数据库)
  • 具有凭据的配置文件
  • 从与数据库交互的每个其他类扩展而来的类(即 Base)。这个类应该包含你的数据库类的实例(即protected $_db,在构造函数$this-&gt;_db = new Database()中)
  • 与数据库交互的每个类 (extends Base) 现在都可以执行 $this-&gt;_db-&gt;prepare(....)

所以这里最重要的是你的连接是一个通过你的数据库交互类共享的对象。

关于循环。您几乎无法使用while() 作为方法返回值。事实上,你会的,但这是一个矫枉过正。

你的方法应该返回获取的结果:

public function getUsers() {
    $query = $this->_db->prepare("SELECT username FROM users");
    $query->execute();
    return $query->fetch(PDO::FETCH_ASSOC);
}

或(这应该不是必需的):

while ($row = $query->fetch(PDO::FETCH_ASSOC) {
    $users[] = $row;
}
return $users; 

这样您的getUsers() 方法将返回结果集作为关联数组,PHP 中处理数组的最佳内置函数是foreach(),因此您需要遍历方法返回值:

foreach ($obj->getUser() as $row) {
    // do smth
}

【讨论】:

  • 我应该将配置文件存储在根目录还是其他位置?我认为它应该是.ini?谢谢
  • 出于安全原因,您可以将其存储在根目录之外(但仍位于服务器可以查看的区域)。如果是.ini,您将需要一个ini 解析器。也许这是一个更好的主意,但我从未使用过它。对于我的所有应用程序配置,我仍在使用一个大的配置 php 数组,其中还有 db 用户、通行证、主机等
猜你喜欢
  • 2014-10-28
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多