Я новичок в php fat-free framework, и я пытаюсь выяснить, как выполнить цикл моих результатов запроса mysql или, еще лучше, получить его как ассоциативный массив (только для учебных целей).
То, что я сделал до сих пор,
while(!$users->dry()){ array_push($user_assoc,$users->cast()); $users->next(); }
Это работает, но мне было интересно, есть ли лучший способ сделать это? Также как настроить обработчик ошибок? Я имею в виду, как я могу проверить, были ли в запросе какие-либо ошибки (то есть mysql_error()
эквивалент mysql_error()
)?
Для выполнения результатов 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-mappers, поскольку они полагаются на один и тот же класс 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 }
Вы уже используете правильный путь. По крайней мере, если вы хотите использовать картограф. С помощью SQL-класса напрямую возвращается ассоциативный массив. В основном все, что связано с этим, описано здесь http://fatfreeframework.com/databases#querying-the-database
$result = $db->exec('SELECT * FROM users'); print_r($result);
Если вы ищете ошибки или хотите узнать, что было выполнено, используйте $db->log();
, http://fatfreeframework.com/databases#profiling