Domanda

Per favore, perdonami per la possibilità della stupidità di questa domanda, ma ho appena iniziato a usare dichiarazioni preparate. So che questa particolare query funziona, poiché l'ho testata con metodi procedurali non preparati. Eccolo:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($content);
$stmt->fetch();
echo  $content;
$stmt->close();

Qualunque consiglio o punto nella giusta direzione è molto apprezzato!

MODIFICA 1: Solo un aggiornamento sui miei progressi mentre provo a risolvere i problemi. Mi sono reso conto che, dal momento che ho una colonna id come indice nella tabella delle sezioni, ho dovuto vincolarla anche di conseguenza, vista la precedente dichiarazione su php.net, (grazie ancora, Bill).

Ecco il nuovo codice:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($id, $name, $content);
$stmt->fetch();
echo $content;
$stmt->close();

Grazie ancora a tutti coloro che possono offrire suggerimenti. (Sono curioso: trovo difficile eseguire il debug quando utilizzo lo stile OOP delle istruzioni preparate in questo modo. Esiste, ad esempio, un modo semplice per vedere semplicemente la query che è stata effettivamente utilizzata?)

MODIFICA 2: Ciao, e grazie per aver fatto quel test, lo apprezzo molto. Capisco la domanda che sei stato costretto a porre, dato che ci ho già distrutto il cervello per un bel po '. Devo dire che esiste.

Se faccio quanto segue, proprio come un esempio veloce e sporco:

$name = 'introduction';
@mysql_connect('host', 'user', 'pass');
@mysql_select_db('db');
$query = "SELECT name,content FROM sections WHERE name = '$name'";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_object($result)) {
    $content = $row->content;
    echo $content;
}

I miei dati vengono visualizzati e tutto va bene. Se, tuttavia, faccio quanto segue:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($name, $content);
$stmt->fetch();
echo  $content;
$stmt->close();

Che credo sia corretto (sentiti libero di urlare se non, ovviamente), non ottengo nulla. Inoltre, con quel codice, quando eseguo una convalida html (per ogni evenienza), ricevo un avviso interno del server (500), che ritengo essere un problema con il codice sql. Sono solo matto?

Grazie per il tuo continuo aiuto, è molto apprezzato!

MODIFICA 3: Beh, mi sento un idiota, ma, l'ho risolto, e Bill, la tua domanda era giusta. Non so come diavolo sono riuscito a inserire i dettagli errati del database e mancarli per così tanto tempo, ma è esattamente quello che è successo.

Grazie ancora per la pazienza e la disponibilità ad aiutare.

È stato utile?

Soluzione

Non vedo nulla di sbagliato nella tua preparazione della dichiarazione o nell'uso dei parametri, ma c'è qualcosa di sbagliato nei tuoi risultati vincolanti:

http://php.net/manual/en/mysqli -stmt.bind-result.php dice:

  

Nota che tutte le colonne devono essere associate   dopo mysqli_stmt_execute () e precedenti   alla chiamata di mysqli_stmt_fetch () .

(sottolineatura mia)


Il documento di cui sopra dovrebbe essere considerato come tutte le colonne nella query, non tutte le colonne nella tabella.

Okay, ho appena provato questo. Se ometto la colonna $ name , viene visualizzato questo avviso:

PHP Warning:  mysqli_stmt::bind_result(): Number of bind variables doesn't 
match number of fields in prepared statement in mysqli.php on line 9
PHP Stack trace:
PHP   1. {main}() /Users/bill/workspace/PHP/mysqli.php:0
PHP   2. mysqli_stmt->bind_result() /Users/bill/workspace/PHP/mysqli.php:9

Ma recupera i dati.

Se associo $ name e $ content ai risultati della query, funzionerà senza errori o avvisi.

Quindi sono costretto a chiederti: sei sicuro che c'è una riga nel database che corrisponde alla tua condizione? Cioè, dove name = 'introduzione' ? Tieni presente che in SQL, i confronti di stringhe fanno distinzione tra maiuscole e minuscole per impostazione predefinita.

Un errore che vedo fare spesso è che si collegano a un database diverso nel loro script PHP rispetto al database che usano per le query ad hoc. Quindi devi essere assolutamente sicuro di verificare che i dati esistano nel database giusto.

Altri suggerimenti

Non dovrebbe essere

$stmt->bind_result($name, $content);

Mentre selezioni 2 colonne

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top