我是php无脂肪框架的新手,我正在尝试弄清楚如何遍历我的mysql查询结果,或者更好的是,将其作为关联数组(仅用于学习目的)。
到目前为止我做的是
while(!$users->dry()){
array_push($user_assoc,$users->cast());
$users->next();
}
这有效,但我想知道是否有更好的方法可以做到这一点?另外我如何设置错误处理程序?我的意思是如何检查查询是否有任何错误(即无等效的mysql_error()
)?
答案 0 :(得分:10)
循环db结果有3种变体:
执行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
}
答案 1 :(得分:1)
您已经使用了正确的方法。至少如果你想使用mapper。通过直接使用SQL类,将返回关联数组。大多数与此相关的所有内容都在http://fatfreeframework.com/databases#querying-the-database
中进行了描述$result = $db->exec('SELECT * FROM users');
print_r($result);
如果您正在查找错误或想知道已执行的内容,请使用$db->log();
。 http://fatfreeframework.com/databases#profiling