我正在尝试编写几个函数,以便以后可以使用PDO对象将它们连接到数据库。我做了一个返回数据,一个用于计数,另一个用于插入。
我的问题是,当有异常时,非他们会返回异常。而且我不确定在哪里需要添加一行来释放存储结果?
这是我目前的职能
function getDataSet($query, $connection){
$cmd = $connection->query( $query );
return $cmd->fetchAll(PDO::FETCH_ASSOC);
}
function getResultsCount($query, $connection){
$cmd = $connection->query( $query );
return $cmd->fetchColumn();
}
function insertRecord($query, $connection){
$cmd = $connection->query( $query );
$connection->free();
return $cmd;
}
这就是我在我的应用程序中使用这些功能的方法
try {
$data = getDataSet(' SELECT name FROM TABLE LIMIT 1000', $db);
foreach($data AS $row){
echo $row[0]['name'] . '<br />';
}
} catch(PDOException $e){
echo 'an error encountered'. $e->getMessage();
}
unset($data);
总结我的问题 如何让这些功能在返回后获得免费结果? 一旦存在,我怎么能返回异常? 我可以使用更好的功能吗? 是否有一个函数来处理prepare语句并返回结果?
谢谢:)
答案 0 :(得分:1)
总能很高兴看到这么好的编程问题。虽然很少见。
你有一个很好的目标,写下所有这些功能,虽然有一个重大错误。您使用它们作为单独的功能,这没有多大意义。所有这些函数都必须是使用内部类资源的数据库类的方法。
虽然你可以从tag wiki,获得大部分答案,但似乎这个网站从未引导它访问这个知识缓存,鼓励他们提出一个新问题,而不是阅读已经写好的答案。那么,你走了:
如果一旦存在,我怎么能返回异常?
要制作PDO trow异常,您必须设置相应的选项:
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn,'root','', $opt);
以这种方式实例化PDO将开始在mysql错误上抛出异常。
是否有处理prepare语句并返回结果的函数?
写下来。
你为什么不想在你的函数中使用prepare / execute?这是一个(是一个类方法,而不是单独的函数):
function getDataSet($query,$data = NULL)
{
$cmd = $this->conn->prepare( $query );
$cmd-> execute($data);
return $cmd->fetchAll();
}
现在您将能够使用参数化查询以及非参数化查询:
$data = $db->getDataSet('SELECT name FROM TABLE LIMIT 1000');
$data = $db->getDataSet('SELECT name FROM table WHERE id < ? LIMIT 1000',array($id));
foreach($data AS $row){
echo $row['name'] . '<br />';
}
(请注意,你不应该只使用try-catch来回显错误信息 - PHP已经做到了,而且更好的方式)
我需要在内存中添加一行来释放结果吗?
我根本不会打扰。它们将被自动清除。
function getResultsCount($ query,$ connection){
事实上,这个功能可以做的不仅仅是返回一个计数。它实际上可以返回查询返回的任何标量值。所以,最好称之为getOneResult
或类似的东西:
$name = $db->getDataSet('SELECT name FROM table WHERE id=?',array($id));
function insertRecord($ query,$ connection){
这个函数再次被命名为错误的方式。事实上,它必须只是通用的query()
函数,它可用于运行INSERT,UPDATE,DELETE或其他任何查询。
我可以使用更好的功能吗?
嗯,毫无疑问,我认为my own class为此目的而写的更好:) 您可以按原样自由使用它,或者只为您自己的课程获得一些想法。