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();
}
在此期間添加一個計數器 – RiggsFolly
在複雜的倒帶和快進中,我寧願不必經常跟蹤自己的櫃檯。 – user2782001
你沒有提到_complex倒帶和快速轉發,_ – RiggsFolly