Hazırlanan tablolardan Mysqli soyutlama, getiriliyor diziler

2 Cevap php

Son zamanlarda sadece iyi çalışmak için kullanılan bir lib bir hata tökezledi, ve nerede olduğunu anlamaya eğer ben mahvolurum.

Aşağıdaki kod örneği olduğunu ve bunu içeride ayıklama şeyler için özür dilerim, ama ben onu işe almak için çalışıyorum.

Sorun $ temp doğru anahtar (sütun adı) ile bir dizidir ama tüm değerleri null olmasıdır.

Ben sorun yatıyor düşünüyorum

call_user_func_array(array($query, 'bind_result'), $params);

biraz, ama gerçekten etrafında başımı sarmak olamaz.

public function fetchRows(){
	error_reporting(E_ALL+E_NOTICE);
	$args = func_get_args();
	$sql = array_shift($args);
	traceVar($sql, "Query");
	$colTypes = array_shift($args);
	if (!$query = $this->prepare($sql, $colTypes)) {
		die('Please check your sql statement : unable to prepare');
	}
	if (count($args)){
		traceVar($args,'Binding params with');
		call_user_func_array(array($query,'bindParam'), $args);
	}

	$query->execute();

	$meta = $query->result_metadata();
	while ($field = $meta->fetch_field()) {
		$params[] = &$row[$field->name];
	}
	traceVar($params,'Binding results with');
	call_user_func_array(array($query, 'bind_result'), $params);

	while ($query->fetch()) {
		traceVar($row,'After fetch');
		$temp = array();
		foreach($row as $key => $val) {
			$temp[$key] = $val;
		} 
		$result[] = $temp;
	}

	$meta->free();
	$query->close(); 
	//self::close_db_conn(); 
	return $result;
}

2 Cevap

Benim için çalışmalarını sağladı kodu.

call_user_func_array(...) function just calls the bindParam veya verilen dizi $query nesne üzerindeki bind_result yöntemleri gibi dizinin her eleman temin sanki bir yöntem argüman.

Eğer aşağıdaki kodu ile sorun yaşıyorsanız SQL deyimini kontrol etmek isteyebilirsiniz. Orijinal kodu soyutlama katmanında deyimi sınıfına bağlıdır beri ben, tamamen test edilebilir hale getirmek için bunu biraz yazılabilir ettik.

<?php

$db_host = 'localhost';
$db_user = 'username';
$db_pass = 'password';
$db_name = 'database';

$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name);

print_r(fetchRows('SELECT something from some_table WHERE some_id = ?', 'i', 1));

function traceVar($a, $b) {
    print_r(array($b => $a));
}

function fetchRows(){
        error_reporting(E_ALL+E_NOTICE);
        $args = func_get_args();
        $sql = array_shift($args);
        traceVar($sql, "Query");

        // Keep the column types for bind_param.
        // $colTypes = array_shift($args);

        // Column types were originally passed here as a second
        // argument, and stored in the statement object, I suppose.
        if (!$query = $GLOBALS['mysqli']->prepare($sql)){ //, $colTypes)) {
                die('Please check your sql statement : unable to prepare');
        }
        if (count($args)){
                traceVar($args,'Binding params with');

                // Just a quick hack to pass references in order to
                // avoid errors.
                foreach ($args as &$v) {
                    $v = &$v;
                }

                // Replace the bindParam function of the original
                // abstraction layer.
                call_user_func_array(array($query,'bind_param'), $args); //'bindParam'), $args);
        }

        $query->execute();

        $meta = $query->result_metadata();
        while ($field = $meta->fetch_field()) {
                $params[] = &$row[$field->name];
        }
        traceVar($params,'Binding results with');
        call_user_func_array(array($query, 'bind_result'), $params);

        while ($query->fetch()) {
                traceVar($row,'After fetch');
                $temp = array();
                foreach($row as $key => $val) {
                        $temp[$key] = $val;
                } 
                $result[] = $temp;
        }

        $meta->free();
        $query->close(); 
        //self::close_db_conn(); 
        return $result;
}

Biz başında sunucu seçmek olsaydı, biz yerine PHP için php-mysql modülünün php-mysqlnd modülünü kullanabilirsiniz. :, (Ve "mysqlnd" için arama ") (phpinfo" Ya da belki zaten bunu kullanarak bazı run)

public function fetchRows(){
    ...
    $query->execute();

    $res = $query->get_result();
    while (($row = $res->fetch_assoc()))
        $result[] = $row;
    return $result;
    }
}

Bu bana basit görünüyor.