PHP + mysqli: Değişken parametre / sonuç hazırlanmış tablolar ile bağlama

4 Cevap php

Ben sarmak üzereyim bir projede, yazılı ve PHP için bir nesne-ilişkisel haritalama çözüm uyguladık. Ben geç statik bağlama işi yapmak için bir yol bulmuş değil - - Ben sadece belki olabilir en iyi şekilde çevresinde çalışıyorum şüpheliler ve hayalperest? "Yeryüzünde nasıl", dinlenmek haykırmak önce.

Ben bind_params() veya bind_result() yöntemleri bağımsız değişken bir dizi geçmek için bir yol ile gelip olamazdı çünkü Neyse, ben şu anda, sorgulama için hazırlanmış deyimleri kullanarak değilim.

Neden bağımsız değişken bir dizi destek gerekiyor, diye mi soruyorsunuz? Benim modellerinin üst sınıf (bir hack-up PHP ActiveRecord özenti olarak benim çözüm düşünüyorum) sorgulama tanımlanır ve böylece find () yöntemi, örneğin, bağlamak gerekir kaç tane parametre bilmiyor nerede olduğu .

Şimdi, zaten bir argüman listesi oluşturma ve eval () bir dize geçen düşündüm, ama ben çok bu çözümü sevmiyorum - Ben yerine sadece kendi güvenlik kontrolleri uygulamak ve tablolar üzerinde geçerdi.

Herkes bu nasıl halletmek için hakkında herhangi bir öneri (ya da başarı öyküleri) var mı? Bana bu ilk sorunu çözmeye yardımcı olabilir, belki sonuç kümesini (o tablo yapısını belirlemek için bir başlangıç ​​sorgu içeriyorsa sanıyorum bir şey daha zor, ya da en azından daha fazla kaynak-yoğun olacak) bağlama üstesinden gelebilirsiniz.

4 Cevap

Sen $ array_of_params links to variables, kendilerini değerleri değil dizi olduğundan emin olmak için var. Olmalıdır:

$array_of_params[0] = &$param_string; //link to variable that stores types

Ve sonra ...

$param_string .= "i";
$user_id_var = $_GET['user_id'];//
$array_of_params[] = &$user_id_var; //link to variable that stores value

Aksi halde (o değerler dizisi ise) alırsınız:

PHP Uyarı: mysqli_stmt Parametre 2 :: bind_param () bir referans olması bekleniyor


Bir örnek daha:

$bind_names[] = implode($types); //putting types of parameters in a string
for ($i = 0; $i < count($params); $i++)
{
   $bind_name = 'bind'.$i; //generate a name for variable bind1, bind2, bind3...
   $$bind_name = $params[$i]; //create a variable with this name and put value in it
   $bind_names[] = & $$bind_name; //put a link to this variable in array
}

ve BOOOOOM:

call_user_func_array( array ($stmt, 'bind_param'), $bind_names); 

Ben düzenlemek için izin, ama ben kod inanıyorum değilim

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

$ Deyim önünde referans gerekli değildir. $stmt nesnesidir ve bindparams o nesne yöntem olduğu için, referans gerekli değildir. Bu olmalıdır:

call_user_func_array(array($stmt, 'bindparams'), $array_of_params);

Daha fazla bilgi için, Callback Functions üzerine PHP kılavuzuna bakın. "

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

Benim ortamında benim için çalışmak ama bu cevap bana doğru yolda set vermedi. Aslında ne amele:

$sitesql = '';
$array_of_params = array();
foreach($_POST['multiselect'] as $value){
    if($sitesql!=''){
        $sitesql .= "OR siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }else{
        $sitesql = " siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }
}

$stmt = $linki->prepare("SELECT IFNULL(SUM(hours),0) FROM table WHERE ".$sitesql." AND week!='0000-00-00'");
call_user_func_array(array(&$stmt, 'bind_param'), $array_of_params);
$stmt->execute();