Bir MySQLi hazırlanmış deyimi yankı nasıl?

3 Cevap php

Ben bütün bunların nasıl işlediğini anlamaya çalışırken, şu anda MySQLi etrafında oynuyorum. Sadece her şeyin doğru olduğundan emin olmak için, kodlama ve hızlı bir şekilde benim kod hata ayıklamak için ise benim şimdiki projelerde hep bir sorgu dizesi echo istiyorum. Ama ... ben hazırlanmış bir MySQLi deyimi ile bunu nasıl yapabilirim?

Örnek:

$id = 1;
$baz = 'something';

if ($stmt = $mysqli->prepare("SELECT foo FROM bar WHERE id=? AND baz=?")) {
  $stmt->bind_param('is',$id,$baz);
  // how to preview this prepared query before acutally executing it?
  // $stmt->execute();
}

Ben (http://www.php.net/mysqli) bu listede geçiyor ancak herhangi bir şans olmadan oldum.


EDIT

Bu MySQLi içinde mümkün değil Eh, belki böyle bir şey ile sopa olacak:

function preparedQuery($sql,$params) {
  for ($i=0; $i<count($params); $i++) {
    $sql = preg_replace('/\?/',$params[$i],$sql,1);
  }
  return $sql;
}

$id = 1;
$baz = 'something';

$sql = "SELECT foo FROM bar WHERE id=? AND baz=?";

echo preparedQuery($sql,array($id,$baz));

// outputs: SELECT foo FROM bar WHERE id=1 AND baz=something

Mükemmellikten uzak, belli ki hala oldukça gereksiz beri - Ben önlemek istediğim bir şey - ve o da bana MySQLi tarafından veri ile yapılıyor ne gibi bir fikir vermez. Ama bütün veriler mevcut ve doğru yerde olup olmadığını bu şekilde çabucak görebilirsiniz ve elle sorgu içine değişkenler montaj kıyasla some zaman beni kurtaracak sanırım - birçok değişkenler ile bir ağrı olabilir.

3 Cevap

Yapabileceğini sanmıyorum - en azından sizin için umut vardı şekilde. Sen Sorgu dize kendiniz oluşturmak ve (bir deyim kullanarak olmadan yani) çalıştırmak zorunda, ya ararlar ya da işlevselliğini destekleyen bir sarıcı yaratacak ya. Kullandığım tek Zend_Db, ve bu ben bunu nasıl olduğunu:

$id = 5;
$baz = 'shazam';
$select = $db->select()->from('bar','foo')
                       ->where('id = ?', $id)
                       ->where('baz = ?', $baz); // Zend_Db_Select will properly quote stuff for you
print_r($select->__toString()); // prints SELECT `bar`.`foo` FROM `bar` WHERE (id = 5) AND (baz = 'shazam')

Sadece son çalıştırılan sorgu ölmek ve çıkış olarak ayarlayın. Hata işleme size sorgusunu düzeltmek için kullanabileceğiniz anlamlı bilgi vermelidir.

Ben geçmişte bu biri ile mücadele etti. Yani o yuvarlak almak için ben SQL, bayraklar ve değişkenlere göre benim için SQL oluşturmak için küçük bir fonksiyon yazdım.

//////////// Test Data //////////////
$_GET['filmID'] = 232;
$_GET['filmName'] = "Titanic";
$_GET['filmPrice'] = 10.99;

//////////// Helper Function //////////////
function debug_bind_param(){
    $numargs = func_num_args();
    $numVars = $numargs - 2;
    $arg2 = func_get_arg(1);
    $flagsAr = str_split($arg2);
    $showAr = array();
    for($i=0;$i<$numargs;$i++){
        switch($flagsAr[$i]){
        case 's' :  $showAr[] = "'".func_get_arg($i+2)."'";
        break;
        case 'i' :  $showAr[] = func_get_arg($i+2);
        break;  
        case 'd' :  $showAr[] = func_get_arg($i+2);
        break;  
        case 'b' :  $showAr[] = "'".func_get_arg($i+2)."'";
        break;  
        }
    }
    $query = func_get_arg(0);
    $querysAr = str_split($query);
    $lengthQuery = count($querysAr);
    $j = 0;
    $display = "";
    for($i=0;$i<$lengthQuery;$i++){
        if($querysAr[$i] === '?'){
            $display .= $showAr[$j];
            $j++;   
        }else{
            $display .= $querysAr[$i];
        }
    }
    if($j != $numVars){
        $display = "Mismatch on Variables to Placeholders (?)"; 
    }
    return $display;
}

//////////// Test and echo return //////////////

echo debug_bind_param("SELECT filmName FROM movies WHERE filmID = ? AND filmName = ? AND price = ?", "isd", $_GET['filmID'], $_GET['filmName'], $_GET['filmPrice']);

Ben de yardım etmek için küçük bir online araç kurmak var.

Mysqli Prepare Statement Checker