1

我正在尝试编写几个函数,以便以后可以使用它们使用 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);

我的问题的总结如何在它们返回后让这些函数释放结果?曾经存在时如何返回异常?我可以使用更好的功能吗?是否有处理准备语句并返回结果的函数?

谢谢 :)

4

1 回答 1

1

看到这么好的编程问题总是很高兴。不过是少见的。

你有一个很好的目标来编写所有这些函数,尽管有一个重大错误。您将它们用作单独的功能,这没有太大意义。所有这些函数都必须是数据库类的方法,使用内部类资源。

尽管您可以从标签 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 错误上引发异常。

是否有处理准备语句并返回结果的函数?

就写吧。
为什么不想在函数中使用准备/执行?这是一个(作为类方法,而不是单独的函数):

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 已经这样做了,而且方法要好得多)

我需要在哪里添加一行来释放结果表单内存?

我根本不会打扰。它们将被自动清除。

函数 getResultsCount($query, $connection){

事实上,这个函数可以做的不仅仅是返回一个计数。它实际上可以返回查询返回的任何标量值。所以,最好叫它getOneResult或类似的东西:

$name = $db->getDataSet('SELECT name FROM table WHERE id=?',array($id));

函数插入记录($查询,$连接){

这个函数又被错误地命名了。事实上,它必须只是通用query()函数,可以用于运行 INSERT、UPDATE、DELETE 或任何其他查询。

我可以使用更好的功能吗?

好吧,毫无疑问,我认为我自己为此目的编写的课程更好:)
您可以按原样自由使用它,或者只是为您自己的课程获得一些想法。

于 2013-03-23T12:38:49.027 回答