编写MySQLI调用的更好方法

时间:2013-07-17 20:04:49

标签: php mysql mysqli

我是stackoverflow的新手。所以希望你理解我的问题

目前我写这样的MySQLI调用 - 但取决于我想要实现的目标。

function getArticles($dbh) {
    $query = "SELECT article_id,article_name,article_text FROM Articles";
    $result = mysqli_query($dbh,$query);
    if(!mysqli_errno($dbh)) {
        if(mysqli_num_rows($query) > 0) {
            $articles = array();
            while($rows = mysqli_fetch_object($query) {
                $articles[] = $rows;
            }
        }
        mysqli_free_result($dbh)
    } else {
        echo mysqli_error($dbh);
    }
    return ($articles);
}

然后我获取它们并在我的调用页面中使用foreach()显示。 我可以以任何方式更好地调用MySQL吗?或者你将如何编写Mysql调用。

3 个答案:

答案 0 :(得分:1)

我也会选择OO方式,但除此之外,我会将查询包装在一个单独的类或函数中。然后,您可以编写一个函数,该函数将SQL查询和参数数组作为输入,并返回一个包含结果或错误代码或错误对象(或数组)的数组。这样,像getArticles这样的函数,你可能有几十个,只包含一行代码,你不必每次都实现循环和错误处理。

这样的事情:

function executeQuery($dbh, $sql)
{
  $result = mysqli_query($dbh, $sql);
  if ($result !== false)
  {
    while($row = mysqli_fetch_object($query) {
      $data[] = $row;
    }
    return $data;
  }
  return false; 

  // Or maybe return some error code or error information?
  // Maybe throw an exception?
  // You could return an array with info, but then you'd have to check 
  // if the resulting array contains data or error information...
}

function getArticles($dbh) {
  return executeQuery(
    $dbh,
    "SELECT article_id,article_name,article_text FROM Articles");
}

看看它是如何从getArticles中提取所有逻辑并在executeQuery中概括它的?

答案 1 :(得分:0)

有一百万种不同的方法可以做到这一点,所以这真的是一种品味问题。您使用的方法是一个非常标准的“PHP for beginners”的处理方式,但是很多人会认为它很麻烦,特别是当您使用它时,您需要为每个SQL查询重写查询函数。大多数人都希望抽象出来,以便代码所做的所有不同事情都包含在一个简单的可重用函数中。

最简单的,可能是将代码更改为以下内容:

function query($dbh, $query) {
         if($resource = mysqli_query($dbh,$query)) {
             while($rows = mysqli_fetch_object($resource) {
                 $result[] = $rows;
             }
         }
     } else {
         echo mysqli_error($dbh);
     }
     return ($result);
 }

说实话,这并没有什么改进,但重点是现在你有一个全局功能,你可以在整个网站上重复使用这两行代码:

 $sql = "SELECT * FROM MYTABLE";
 $result = query($dbh,$sql);

作为一个实例化数据库连接等的对象会做得更好,这样你就可以调用一个函数或者可能调用所有数据库连接和查询解析内容的类。

答案 2 :(得分:0)

我有点依赖。对于一次性脚本,无论您使用OO还是程序API,最终结果都是相同的:在一种情况下,您在另一种情况下使用$dbh->method(...)得到mysqli_method($dbh, ...)。完全是句法糖。

在稍微大一点的我自己的SQL代码上,我倾向于求助于我当前版本的重新发明的SQL< - > PHP轮子如下:

  1. 管理与DB连接的单个类,提供单例模式类型访问。方法接受描述要执行的SQL查询类型的对象。面向准备好的语句,将数据库配置为抛出异常等,以获得更自然的OO代码。
  2. 一个SQL查询接口,它提供了逐行检索SQL,相关参数和接收DB结果的方法(关联数组),错误处理等(您通常希望在一个案例中处理这个问题) - 基础)。
  3. SQL查询接口的实现,为方便起见,通常继承自默认(抽象基类)实现。这些实现提供了额外的功能,基本上在“关联数组”模型之上提供了PHP对象模型。这通常是一组对象或只是一个对象,这两种情况都很容易实现。
  4. 步骤3的结果是,您不会执行SQL,而是进行延迟加载资源。您可以构造查询类型的对象,并且可以将加载(执行查询)推迟到PHP代码的整体控制流程中的某个稍后点。该属性有助于将数据与演示文稿完全分开。控制流。它还可以更容易地进行透明的正确内容协商,因为这只会插入不同版本的表示对象。