2

我是 php fat-free 框架的新手,我正在尝试弄清楚如何循环遍历我的 mysql 查询结果,或者更好的是,将它作为关联数组获取(仅用于学习目的)。

到目前为止我所做的是

while(!$users->dry()){
   array_push($user_assoc,$users->cast());
   $users->next();
}

这行得通,但我想知道是否有更好的方法来做到这一点?另外如何设置错误处理程序?我的意思是如何检查查询是否有任何错误(即无脂肪等价物mysql_error())?

4

2 回答 2

12

数据库查询

有 3 种变体可以遍历 db 结果:

没有映射器:

执行 SQL 查询并将结果集作为关联数组的数组获取:

$users = $db->exec('SELECT * FROM users');
foreach($users as $user)
  echo $user['name'];//associative array

使用映射器->加载:

一一获取映射器行(您的方法):

$user=new \DB\SQL\Mapper($db,'users');
$user->load('');
while(!$user->dry()) {
  echo $user->name;//db mapper
  $user->next();
}

使用映射器-> 查找:

获取结果集作为映射器数组:

$mapper=new \DB\SQL\Mapper($db,'users');
$users=$mapper->find('');
foreach($users as $user)
  echo $user->name;//db mapper

数据库错误处理

\DB\SQL 是 PDO 的子类,因此它可以抛出可捕获的 PDO 异常。由于这些默认情况下被禁用,因此您需要先启用它们。这可以通过两种不同的方式完成:

  • 在实例化时,对于所有事务:

    $db = new \DB\SQL($dsn, $user, $pwd, array( \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION ));

  • 稍后在代码中,基于每个事务:

    $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

一旦启用 PDO 异常,只需将它们作为其他异常捕获:

try {
  $db->exec('INSERT INTO mytable(id) VALUES(?)','duplicate_id');
} catch(\PDOException $e) {
  $err=$e->errorInfo;
  //$err[0] contains the error code (23000)
  //$err[2] contains the driver specific error message (PRIMARY KEY must be unique)
}

这也适用于 DB 映射器,因为它们依赖于相同的 DB\SQL 类:

$db=new \DB\SQL($dsn,$user,$pwd,array(\PDO::ATTR_ERRMODE=>\PDO::ERRMODE_EXCEPTION));
$mytable=new \DB\SQL\Mapper($db,'mytable');
try {
  $mytable->id='duplicate_id';
  $mytable->save();//this will throw an exception
} catch(\PDOException $e) {
  $err=$e->errorInfo;
  echo $err[2];//PRIMARY KEY must be unique
}
于 2014-03-12T07:11:57.170 回答
1

您已经使用了正确的方法。至少如果你想使用映射器。通过直接使用 SQL 类,返回一个关联数组。与此相关的大部分内容都在此处描述http://fatfreeframework.com/databases#querying-the-database

$result = $db->exec('SELECT * FROM users'); 
print_r($result);

如果您正在查找错误或想知道已执行的内容,请使用$db->log();. http://fatfreeframework.com/databases#profiling

于 2014-03-11T23:43:24.307 回答