【发布时间】: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,您可以在其中找到
PDOStatementclass,其中包含您正在寻找的方法,例如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,无法在此处粘贴代码。仍然没有足够的特权。顺便说一句,我想出了一个办法。感谢您的支持。