我在尝试从mysql_迁移到PDO时遇到了一些问题(我用它来做新事物)。
我已经完成了大部分工作,但是这个功能让我发疯了。
这是:
function fields($thequery) /* SELECT * FROM table */
{
$fields=array();
$fields['num']=mysql_num_fields($thequery);
for ($i = 0; $i < $fields['num']; $i++) {
$fields['data'][]=mysql_fetch_field($result, $i);
}
return $fields;
}
我试过阅读其他一些帖子,但我无法弄清楚。
这是我目前最好的,但我总是得到未定义的索引&#34; num&#34;。
function fields($thequery)
{
global $pdo; /* Connection */
$result = $pdo->prepare($thequery);
$result->execute();
$fields['num'] = $result->rowCount();
for ($i = 0; $i < $fields['num']; $i++) {
$fields['data'][]=$result->getColumnMeta($i);
}
return $fields;
}
我做错了什么? 提前谢谢!
答案 0 :(得分:1)
你有几个问题。首先,您没有在第二个函数$fields = array();
中声明fields数组,然后在计算行时遇到问题:
$result->rowCount();
您的查询可能是SELECT
查询,不适用于rowCount()
来自docs
PDOStatement :: rowCount()返回受相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数。
对于SELECT
当您没有执行COUNT()
查询时,您可以在$result->execute();
$rows = $result->fetchAll();
$num_rows = count($rows);
答案 1 :(得分:1)
我看到了问题;如果您打算致电PDOStatement::rowCount()
,请致电PDOStatement::columnCount()
。
您的代码应为
function fields($thequery)
{
global $pdo; /* Connection */
$result = $pdo->prepare($thequery);
$result->execute();
$fields['num'] = $result->columnCount(); // Change this line
for ($i = 0; $i < $fields['num']; $i++)
{
$fields['data'][] = $result->getColumnMeta($i);
}
return $fields;
}
请注意,the documentation for PDOStatement::getColumnMeta()
包含以下警告:
警告此功能 EXPERIMENTAL 。这个函数的行为, 它的名称和周围的文档可能会更改,恕不另行通知 PHP的未来版本。使用此功能需要您自担风险。
警告并非所有PDO驱动程序都支持 PDOStatement :: getColumnMeta()。
答案 2 :(得分:0)
好吧,我已经尝试过Jay Blanchard和Darwin von Corax所说的话。
问题是数组(我忘了声明它)和columnCount()。
最大的问题是我误解了这个功能。我确信这是在计算行...我不知道为什么,现在看起来很合理!
function fields($thequery) {
global $pdo;
$result = $pdo->prepare($thequery);
$fields = array();
$result->execute();
$fields['num'] = $result->rowCount();
for ($i = 0; $i < $fields['num']; $i++) {
$fields['data'][]=$result->getColumnMeta($i);
}
return $fields; }