2013-04-01 13 views
8

Sto cercando di far funzionare il seguente codice ma non riesco a raggiungere la linea execute().Come eseguire l'istruzione bind_param() in PHP?

$mysqli = $this->ConnectLowPrivileges(); 
echo 'Connected<br>'; 
$stmt = $mysqli->prepare("SELECT `name`, `lastname` FROM `tblStudents` WHERE `idStudent`=?"); 
echo 'Prepared and binding parameters<br>'; 
$stmt->bind_param('i', 2); 
echo 'Ready to execute<br>' 
if ($stmt->execute()){ 
    echo 'Executing..'; 
    } 
} else { 
    echo 'Error executing!'; 
} 
mysqli_close($mysqli); 

L'output che ottengo è:

Connected 
Prepared and binding parameters 

Quindi il problema dovrebbe essere alla linea 5, ma controllando la manual of bind_param() non riesco a trovare alcun errore di sintassi lì.

+3

Perché non echo l'errore ricevuto per facilitare il debug? Penso che echoing '$ stmt-> error' ti darà l'esatto errore di cui mi lamenta mysql. – Todd

+0

Ho aggiornato la mia domanda, perché ora non posso nemmeno eseguire la riga seguente dopo 'bind_param()'! @Todd Questo è utile, importante da avere in mente. – Lucio

risposta

11

Quando si associa i parametri necessari per passare una variabile che viene utilizzata come riferimento:

$var = 1; 

$stmt->bind_param('i', $var); 

consultare il manuale: http://php.net/manual/en/mysqli-stmt.bind-param.php

Nota che $var in realtà non deve essere definito per legarlo . Quanto segue è perfettamente valida:

$stmt->bind_param('i', $var); 

foreach ($array as $element) 
{ 

    $var = $element['foo']; 

    $stmt->execute(); 

} 
+2

+1, incredibile, hai qualche riferimento per questo fatto? Non l'ho mai saputo :) –

+0

Sì, ho aggiunto il link alla mia risposta. – MichaelRushton

+0

Tnx !!! Ho avuto lo stesso problema come per 3 ore .... –

-6

Il tuo problema reale non è in linea 5, ma piuttosto alla linea 1.
Si sta tentando di usare il driver inutilizzabile.
Mentre PDO fa esattamente quello che vuoi.

$sql = "SELECT `name`, `lastname` FROM `tblStudents` WHERE `idStudent`=?" 
$stm = $this->pdo->prepare($sql); 
$stm->execute(array(2)); 
return $stm->fetch(); 

Dopo tutti gli anni passati da quando questa risposta è stata scritta, una nuova funzionalità di PHP è emerso, chiamato "argomento spacchettamento". Così, a partire dalla versione 5.6 è possibile passare un valore nella bind_param:

$stmt->bind_param('i', ...[2]); 

Ma ancora avete un problema con ottenere i vostri dati da una dichiarazione preparata :)

+0

Se è inutilizzabile, allora perché c'è un software là fuori costruito su di esso, funzionante come previsto? –

+0

perché la gente lo usa brutalmente come vecchio mysql ext, ** mantiene tutti gli inconvenienti e l'insicurezza ** –

+0

Svantaggi e insicurezza, sono d'accordo. "Inutilizzabile" è qualcos'altro. –

-1

qui si tratta solo di una semplice spiegazione
dichiarare una variabile da associare

$var="email"; 
$mysqli = $this->ConnectLowPrivileges(); 
echo 'Connected<br>'; 

$var="email"; 
$stmt = $mysqli->prepare("SELECT name, lastname FROM tablename WHERE idStudent=?" LIMIT=1); 
echo 'Prepared and binding parameters<br>'; 
$stmt->bindparam(1,$var);