9

我想将 mysql_data_seek 与谷歌搜索中的 PDO 一起使用,我发现它应该如下所示:

$row0 = $result->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, 0);

但是它不起作用,我做错了什么?这是我的代码:

$query = "SELECT name,age FROM users";
$q = $db->prepare($query);
$q->execute();

$q->setFetchMode(PDO::FETCH_ASSOC);
$arrayData = $q->fetchAll();

foreach ($arrayData as $row){

    echo $row['name'] ." ";
    echo $row['age'] ."<br>";
}

$result = $q->fetch(PDO::FETCH_OBJ,PDO::FETCH_ORI_ABS,4);
var_dump($result);

我只想从上次运行查询中获取对象形式的第 5 行。我不想再次运行这个查询(正如一些人告诉我的那样)我只想要来自 sql 缓冲区的结果。

var_dump 结果是:bool(false)

有任何想法吗?

编辑:

感谢您的回答,对不起,但也许我也没有解释自己。我喜欢 JSON 的技巧,但关键是第 5 行是示例。我只想使用 PDO 缓冲区中的查询结果,就像我在常规 mysql 中使用 mysql_data_seek 所做的一样(更改光标)。可能吗?我喜欢所有的技巧,但这不是我想要的。

4

4 回答 4

8

PDO 'cursor' 默认是 PDO::CURSOR_FWDONLY这意味着游标不能像 mysql_data_seek 发生的那样回到零,以允许游标回到零,必须定义使用'scrollable cursor'

例子:

$db->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));

在像这样使用它之前:

$row0 = $result->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, 0);
于 2013-04-16T12:34:08.810 回答
2
$result = $arrayData[4];

是你所需要的全部。

于 2013-03-26T14:38:11.347 回答
1

你可以这样做:

$c = 1;
$saved=null; 
while($row = $q->fetch()){
    if($c==4){
        $saved = clone $row;
    };
    $c++;
    somethingelse;
}

然后 $saved 将包含第 4 个元素作为对象,几乎没有额外的开销计算。

于 2013-03-26T13:05:33.470 回答
1

如果你想要第 5 行的结果,你可以这样做:

$result = json_decode(json_encode($arrayData[4]), FALSE);
var_dump($result);

或类似的东西:

$object = new stdClass();
foreach ($array as $key => $value)
{
    $object->$key = $value;
}

只是好奇!为什么需要对象形式?

编辑(这将给出第 5 行的对象形式):

$index = 0;
$fifthRow = new stdClass();
while($row = $q->fetch())
{
   if($index++==4)
        $fifthRow = json_decode(json_encode($row), FALSE);
}   
于 2013-03-26T12:53:24.407 回答