PDO中用于mysql_result()函数的替代方法

时间:2013-07-24 16:24:18

标签: php mysql pdo

我一直在php中使用mysql抽象类,现在我希望通过使用PDO使该类更加可用和可靠。在我的课上,我使用了mysql_result()函数,该函数有三个参数:

  • result:正在评估的结果资源。这个结果来自调用mysql_query()。
  • row:正在检索的结果中的行号。行号从0开始。
  • field:要检索的字段的名称或偏移量。

如何使用PDO实现类似的输出?

这是用本机mysql函数编写的代码。

public function SQLtoJSON($query, $indented = false)
    {
        $query = mysql_query($query) or die ('MyJSON - SQLtoJSON - Cannot make query');

        if (!$numFields = mysql_num_fields($query)) {
            $this->errors[] = 'SQLtoJSON - Cannot get number of MySQL fields';
            return false;
        }

        $fields = array();
        for ($i = 0; $i < $numFields; $i++)
            $fields[$i] = mysql_field_name($query, $i);

        if (!$numRows = mysql_num_rows($query)) {
            $this->errors[] = 'SQLtoJSON - Cannot get number of MySQL rows';
            return false;
        }

        $res = array();
        for ($i = 0; $i < $numRows; $i++) {
            $res[$i] = array();
            for ($j = 0; $j < count($fields); $j++)
                $res[$i][$fields[$j]] = mysql_result($query, $i, $j);
        }

        $json = json_encode($res);
        if ($indented == false)
            return $json;

以下是使用PDO的代码的更新版本:

class MySql_To_Json
{

    private $connection;
    public $errors = array();

    public function __construct($db_server, $db_username, $db_password, $db_name)
    {
        $this->connection = new PDO("mysql:host=$db_server;dbname=$db_name",   $db_username, $db_password);
    }

    public function MySQLtoJSON($query)
    {
        $query = $this->connection->query($query) or die("Unable to execute the query");
        if (!$numFields = $query->columnCount()) {
            $this->errors[] = "Unable to get the number of fields";
            return false;
        }

        $fields = array();
        $colNames = array();

        for ($i = 0; $i < $numFields; $i++) {
            $fields[$i] = $query->getColumnMeta($i);
            foreach ($fields as $field) {
                $colNames[] = $field['name'];
            }
        }

        if (!$numRows = $query->rowCount()) {
            $this->errors[] = "Unable to get the number of rows";
            return false;
        }

    // return $numRows;
        $result = array();
        for ($i = 0; $i < $numFields; $i++) {
            $result[$i] = array();
            for ($j = 0; $j < count($field); $j++) {
                return $result[$i][$field[$j]] = $query->fetch($i);
            }
        }

        $json = json_encode($result);
        return $json;
    }
}

1 个答案:

答案 0 :(得分:0)

正如我在评论中所怀疑和暗示的那样,您最初使用mysql_result()是不必要的。你在旧类中所拥有的是C风格的增量for循环的集合,这在PHP中很少适用。相反,使用foreach迭代数组并在处理数据库API时更常见,例如:

// This is the normal and easy way to get an associative array of results:
while ($row = mysql_fetch_assoc()) {
  $results[] = $row;
}

...您无需担心行数或列数。

在任何情况下,所有这一切现在都是完全没有必要的,并且可以在PDO中单独调用fetchAll()来替换,因为它所做的就是将所有行检索到列名索引数组中。这与获取操作的标准大致相同。

   // ALL of this...
   // $res = array();
   // for ($i = 0; $i < $numRows; $i++) {
   //     $res[$i] = array();
   //     for ($j = 0; $j < count($fields); $j++)
   //         $res[$i][$fields[$j]] = mysql_result($query, $i, $j);
   // }

   // ...may be replaced with simply:
   $res = $query->fetchAll(PDO::FETCH_ASSOC);

这也意味着您确实不需要前两个块来检索行数和列数。所有这些都隐含在对fetchAll()的调用中。您实际需要的唯一部分是查询和获取:

public function MySQLtoJSON($input_query)
{
    // Do your query...
    $query = $this->connection->query($input_query) or die("Unable to execute the query");

    // Fetch the rows as associative arrays
    $result = $query->fetchAll(PDO::FETCH_ASSOC);

    // And encode it as JSON
    $json = json_encode($result);
    return $json;
}

请注意,由于您在$query参数中执行任意SQL语句,因此需要谨慎处理在那里传递的内容以避免SQL注入。如果您接受任何用户输入而不是静态查询,则需要调整此选项以使用PDO::prepare()并将其作为参数化查询执行。