【问题标题】:Alternative method in PDO for mysql_result() functionmysql_result() 函数的 PDO 中的替代方法
【发布时间】:2013-07-24 16:24:18
【问题描述】:

我一直在 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;
    }
}

【问题讨论】:

  • 请查看PDO manual,您可以在其中找到PDOStatement class,其中包含您正在寻找的方法,例如fetch。请记住,mysql_result 的使用相当罕见,因为这种行为有点……奇怪。
  • 您可以执行 fetchAll() 然后通过数组键访问行,但老实说,我建议您重构代码不要依赖于 mysql_result() 行为。如果您正在挑选行,这通常意味着您的查询可以更智能地执行以仅返回开始所需的内容,如果您使用 mysql_result() 循环,则可能更好地将其重构为更传统的 fetch 循环。
  • @Michael Berkowski,感谢您的回复。实际上,我有一个将 mysql 查询转换为 json 对象的类。该类是使用 mysql 数据库特定功能编写的。现在我想使用 PDO 转换类以更多地扩展功能。 mysql_query()、mysql_result() 将很快被弃用。我坚持使用 mysql_result()。如果你有兴趣,我可以把我的代码分享给你:)
  • @MahmudurRahmanShibly 贴出相关代码。 mysql_result() 的专用用途有点奇怪,所以很有可能你真的只需要一个简单的 fetch 循环加上像 json_encode() 这样的东西。
  • @Michael Berkowski,无法在此处粘贴代码。仍然没有足够的特权。顺便说一句,我想出了一个办法。感谢您的支持。

标签: php mysql pdo


【解决方案1】:

正如我在 cmets 中所怀疑和暗示的那样,您最初使用 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() 的单个调用来替换,因为它所做的只是将所有行检索到一个列名索引数组中。这与 fetch 操作一样标准。

   // 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() 并将它们作为参数化查询执行。

【讨论】:

  • 太棒了!学到了很多 !谢谢你的精彩解释。
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 2012-08-22
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2011-09-24
  • 1970-01-01
相关资源
最近更新 更多