2017-01-21 23 views
1
mysqli_result->data_seek($offset) 

會得到您在該偏移處的行,但無論如何要知道結果集當前處於什麼偏移位置?PHP mysqli_result獲取當前位置

簡單說明....

while($row=$result->fetch_assoc()){ 
     //what offset is $result on now? 
} 

在保持上述的粘性與一個簡單的計數器是容易的,在更復雜的反繞和快進sceanrios它成爲一個疼痛。 implementations I've seen from years ago寫了擴展類,以確保manullay創建的計數器在使用 - > fetch_ *(或data_seek)調用時增加。這仍然是唯一的選擇嗎?

編輯

我採取它在自己被分叉mysqli擴展which is on github 尋找到它。但是我與C和PHP擴展開發總初學者。這是我的第一印象。

的mysqli_result_iterator.c限定內部指針作爲ROW_NUM

typedef struct { 
    zend_object_iterator intern; 
    mysqli_object *result; 
    zval current_row; 
    my_longlong row_num; //THIS IS WHAT WE WANT TO EXPOSE! 
} php_mysqli_result_iterator; 

SO。在我的文件,它看起來像我需要添加一個方法...

static long php_mysqli_result_iterator_row_num(zend_object_iterator *iter){ 
    php_mysqli_result_iterator *iterator = (php_mysqli_result_iterator*) iter; 

    return iterator->row_num; 
} 

和功能在該文件

zend_object_iterator_funcs php_mysqli_result_iterator_funcs = { 
    php_mysqli_result_iterator_dtor, 
    php_mysqli_result_iterator_valid, 
    php_mysqli_result_iterator_current_data, 
    php_mysqli_result_iterator_current_key, 
    php_mysqli_result_iterator_move_forward, 
    php_mysqli_result_iterator_rewind, 

    //ADDING CURRENT ROW NUM RETURN 
    php_msqli_result_iterator_row_num, 
    NULL 
}; 

設法尋找年底增加了Zend DEFS如何mysqli_result_iterator使用我發現它是像這樣實現的mysqli.c ...

REGISTER_MYSQLI_CLASS_ENTRY("mysqli_result", mysqli_result_class_entry, mysqli_result_methods); 
ce = mysqli_result_class_entry; 

//HERE IS THE ITERATOR 
mysqli_result_class_entry->get_iterator = php_mysqli_result_get_iterator; 
mysqli_result_class_entry->iterator_funcs.funcs = &php_mysqli_result_iterator_funcs; 

zend_class_implements(mysqli_result_class_entry, 1, zend_ce_traversable); 

不過,我找不到任何地方在迭代是不斷從學習互動。

告訴我,如果我在正確的軌道上......用fetch_all方法定義從mysqli_nonapi.c它看起來像這樣

PHP_FUNCTION(mysqli_fetch_all) 
{ 
MYSQL_RES *result; 
zval  *mysql_result; 
zend_long  mode = MYSQLND_FETCH_NUM; 

if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &mode) == FAILURE) { 
    return; 
} 
MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, mysql_result, "mysqli_result", MYSQLI_STATUS_VALID); 

if (!mode || (mode & ~MYSQLND_FETCH_BOTH)) { 
    php_error_docref(NULL, E_WARNING, "Mode can be only MYSQLI_FETCH_NUM, " 
        "MYSQLI_FETCH_ASSOC or MYSQLI_FETCH_BOTH"); 
    RETURN_FALSE; 
} 

mysqlnd_fetch_all(result, mode, return_value); 

}

我的猜測是我需要做的像

PHP_FUNCTION(mysqli_current_row_num) 
{ 
MYSQL_RES *result; 
zval  *mysql_result; 


if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &mode) == FAILURE) { 
    return; 
} 
//this loads the result into my local result variable as a reference?? 
MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, mysql_result, "mysqli_result", MYSQLI_STATUS_VALID); 

/*Now what : do I need to use the get_iterator like this..*/ 
return result->get_iterator()->row_num; 

/* do I need to use the entire iterator method name*/ 
    return result->php_mysqli_result_iterator_row_num(); 

} 
+2

在此期間添加一個計數器 – RiggsFolly

+0

在複雜的倒帶和快進中,我寧願不必經常跟蹤自己的櫃檯。 – user2782001

+0

你沒有提到_complex倒帶和快速轉發,_ – RiggsFolly

回答

0

快速soloution:

$counter = 0; 

while($row=$result->fetch_assoc()){ 
    $counter++; 
    // DO STUFF for actual $counter (offset); 
} 
+0

似乎有人需要這個之前寫了類擴展,以確保計數器總是增加mysqli_result-> fetch_ *調用...但結果集有一個內部指針,所以爲什麼不公開PHP呢? – user2782001

+1

@ user2782001因爲20年來我從來沒有真正需要知道我在結果集中的位置。你能描述一下你的需求嗎,爲什麼你需要知道你正在處理哪一行,以及爲什麼你需要在結果集中跳轉 – RiggsFolly