2009-09-05 8 views
5

Przeszukałem internet na dobry przykład, ale nie mogę znaleźć niczego.Jak utworzyć poprawną klasę rozszerzenia mysqli z przygotowanymi instrukcjami?

Próbuję rozszerzyć klasę mysqli, aby utworzyć klasę pomocniczą, która usunie część złożoności. Jedną z głównych rzeczy, które chcę osiągnąć, jest wykorzystanie przygotowanych oświadczeń.

Nie wiem, od czego zacząć i jak poprawnie obsłużyć dane wejściowe i wyjściowe w jednej klasie. Innym problemem jest to, że nie mogę wyprowadzać danych jako tablicy przy użyciu przygotowanych instrukcji.

Naprawdę mógłbym użyć prostego przykładu, aby wskazać mi właściwy kierunek.

Dzięki!

Odpowiedz

5

Sprawdź implementację Zend_Db, aw szczególności Zend_Db_Select. W rzeczywistości możesz po prostu zdecydować się na to, zamiast tworzyć własne. Przykłady:

//connect to a database using the mysqli adapter 
//for list of other supported adapters see 
//http://framework.zend.com/manual/en/zend.db.html#zend.db.adapter.adapter-notes 
$parameters = array(
        'host'  => 'xx.xxx.xxx.xxx', 
        'username' => 'test', 
        'password' => 'test', 
        'dbname' => 'test' 
        ); 
try { 
    $db = Zend_Db::factory('mysqli', $parameters); 
    $db->getConnection(); 
} catch (Zend_Db_Adapter_Exception $e) { 
    echo $e->getMessage(); 
    die('Could not connect to database.'); 
} catch (Zend_Exception $e) { 
    echo $e->getMessage(); 
    die('Could not connect to database.'); 
} 

//a prepared statement 
$sql = 'SELECT * FROM blah WHERE id = ?'; 
$result = $db->fetchAll($sql, 2); 

//example using Zend_Db_Select 
$select = $db->select() 
      ->from('blah') 
      ->where('id = ?',5); 
print_r($select->__toString()); 
$result = $db->fetchAll($select); 

//inserting a record 
$row = array('name' => 'foo', 
      'created' => time() 
      ); 
$db->insert('blah',$row); 
$lastInsertId = $db->lastInsertId(); 

//updating a row 
$data = array(
    'name'  => 'bar', 
    'updated' => time() 
); 

$rowsAffected = $db->update('blah', $data, 'id = 2');  
+0

Miałem nadzieję, aby moje własne, ale nie jestem pewien. Czy '$ db-> fetchAll ($ sql, 2);' zachowuje się jak mysql_fetch_array? Dlaczego wydaje się, że w każdym skrypcie musi istnieć tak dużo zbędnego kodu? Czy mogę stworzyć kolejną klasę, która poradzi sobie ze wszystkim do końca tej próby, stwierdzenia połowu lub czy jest to uważane za złą praktykę? –

+0

@Jon - fetchAll zwróci tablicę asocjacyjną domyślnie (można ją zmienić, są również fetchRow, fetchCol, fetchOne itd.). Długie try..catch idealnie pojawi się tylko raz w twojej aplikacji w bootstrapie (lub w dołączeniu lub takim), więc to nie jest problem. – karim79

+0

OK, wygląda to tak, jak ja pójdę. Dzięki za pomoc! –

0

Zakładając jesteś rzeczywiście chce napisać własną wersję (w przeciwieństwie do wykorzystania jednego z istniejących bibliotek inne odpowiedzi zasugerowały - i to są dobre opcje też) ...

Oto kilka funkcji, które mogą okazać się przydatne do zbadania. Pierwsza pozwala na powiązanie wyników zapytania z tablicą asocjacyjną, a druga pozwala na przekazanie dwóch tablic, jednej uporządkowanej tablicy kluczy, a drugiej asocjacyjnej tablicy danych dla tych kluczy i powiązanie tych danych z danymi. przygotowane oświadczenie:

function stmt_bind_assoc (&$stmt, &$out) { 
    $data = mysqli_stmt_result_metadata($stmt); 
    $fields = array(); 
    $out = array(); 

    $fields[0] = $stmt; 
    $count = 1; 

    while($field = mysqli_fetch_field($data)) { 
     $fields[$count] = &$out[$field->name]; 
     $count++; 
    } 
    call_user_func_array(mysqli_stmt_bind_result, $fields); 
} 

function stmt_bind_params($stmt, $fields, $data) { 
    // Dynamically build up the arguments for bind_param 
    $paramstr = ''; 
    $params = array(); 
    foreach($fields as $key) 
    { 
     if(is_float($data[$key])) 
      $paramstr .= 'd'; 
     elseif(is_int($data[$key])) 
      $paramstr .= 'i'; 
     else 
      $paramstr .= 's'; 
     $params[] = $data[$key]; 
    } 
    array_unshift($params, $stmt, $paramstr); 
    // and then call bind_param with the proper arguments 
    call_user_func_array('mysqli_stmt_bind_param', $params); 
} 
0

pisałem klasy otoki, aby to zrobić - zapewnia identyczny interfejs dla parametryzacji zapytań z obu MySQLi lub PDO. Interfejs umożliwia wykonanie sparametryzowanego SQL w jednym wierszu kodu, co znacznie upraszcza twój własny kod.

http://www.robpoyntz.com/blog/?p=191

Powiązane problemy