Vra

In 'n projek wat ek nou gaan draai, het ek geskryf en geïmplementeer 'n voorwerp-relational mapping oplossing vir PHP. Voor die twyfelaars en dromers uitroep "? Hoe op aarde", ontspan - ek het nie 'n manier gevind om die einde van statiese binding te laat werk -. Ek is net besig om dit in die beste manier wat ek moontlik kan

In elk geval, ek is nie op die oomblik gebruik van voorbereide state vir die gebruik daarvan, want ek kon nie kom met 'n manier om 'n veranderlike aantal argumente om die bind_params() of bind_result() metodes te slaag.

Hoekom het ek nodig om 'n veranderlike aantal argumente te ondersteun, vra jy? Omdat die superklas van my modelle (dink aan my oplossing as 'n gekap-up PHP ActiveRecord wannabe) is waar die gebruik daarvan word gedefinieer, en so die metode vonds (), byvoorbeeld, weet nie hoeveel parameters dit nodig sou wees om te bind .

Nou, Ek het al gedink van die bou van 'n argument lys en verby 'n string te eval (), maar ek hou nie van die oplossing baie - ek wil eerder net te implementeer my eie sekuriteit kontrole en slaag op state .

Is daar iemand enige voorstelle (of suksesverhale) oor hoe om dit gedoen te kry? As jy kan help my hierdie eerste probleem op te los, miskien kan ons pak bindende die gevolg set (iets wat ek vermoed sal moeiliker, of ten minste meer hulpbron-intensiewe wees as dit behels 'n aanvanklike navraag aan tafel te bepaal).

Was dit nuttig?

Oplossing

In PHP kan jy 'n veranderlike aantal argumente om 'n funksie of metode slaag deur gebruik te maak van call_user_func_array . 'N Voorbeeld vir 'n metode sou wees:

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

Die funksie sal belê word deur elke lid in die skikking geslaag as sy eie argument.

Ander wenke

Jy het om seker te maak dat $ array_of_params is verskeidenheid van skakels na veranderlikes , hulself nie waardes. Moet wees:

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

En dan ...

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

Anders (as dit is verskeidenheid van waardes) jy kry:

  

PHP Waarskuwing: Parameter 2 tot mysqli_stmt :: bind_param () verwag om 'n verwysing te wees


Nog 'n voorbeeld:

$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
}

en BOOOOOM:

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

Ek is nie toegelaat om te verander, maar ek glo in die kode

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

Die verwysing in die voorkant van $ stmt is nie nodig nie. Sedert $stmt is die voorwerp en bindparams is die metode in daardie voorwerp, die verwysing is nie nodig nie. Dit moet wees:

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

Vir meer inligting, sien die PHP handleiding op Terugbel Funksies ."

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

Het nie werk vir my in my omgewing, maar hierdie antwoord my op die regte pad. Wat eintlik gewerk het:

$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();
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top