2012-07-05 25 views
8

Eventuali duplicati:
PHP: Warning: sort() expects parameter 1 to be array, resource givenmysqli_fetch_assoc() si aspetta parametro 1 per essere mysqli_result, booleano dato

Sono abbastanza nuovo per PHP e MySQL e io non riesco a capire questo uno su. Ho cercato in tutto il forum ma non ho trovato una risposta che possa dare un senso. Originariamente stavo usando mysql_fetch_assoc() ma potevo solo cercare numeri e ho ricevuto errori durante la ricerca di lettere. Spero di essere sulla strada giusta qui. Grazie in anticipo per tutto il tuo aiuto!

$con = mysqli_connect($hostname,$username,$password) or die ("<script language='javascript'>alert('Unable to connect to database')</script>"); 
mysqli_select_db($con, $dbname); 

if (isset($_GET['part'])){ 
    $partid = $_GET['part']; 
    $sql = 'SELECT * 
     FROM $usertable 
     WHERE PartNumber = $partid'; 

    $result = mysqli_query($con, $sql); 
    $row = mysqli_fetch_assoc($result); 

    $partnumber = $partid; 
    $nsn = $row["NSN"]; 
    $description = $row["Description"]; 
    $quantity = $row["Quantity"]; 
    $condition = $row["Conditio"]; 
} 
+2

Non dimenticare di filtrare '$ _GET ['parte']' per impedire l'iniezione SQL. – honyovk

risposta

17

Ciò accade quando il risultato non è un risultato (ma un "falso"). Si dovrebbe modificare questa linea

$sql = 'SELECT * FROM $usertable WHERE PartNumber = $partid'; 

a questo:

$sql = "SELECT * FROM $usertable WHERE PartNumber = $partid"; 

perché il "grado di interpretare $ variabili po 'non può

funziona bene con gli interi (numeri), per le stringhe è necessario. mettere la variabile $ in virgolette singole, come

$sql = "SELECT * FROM $usertable WHERE PartNumber = '$partid' "; 

Se si vogliono/devono lavorare con apici, quindi PHP può non interpretare le variabili, si dovrà fare in questo modo:

$sql = 'SELECT * FROM '.$usertable.' WHERE string_column = "'.$string.'" AND integer_column = '.$number.'; 
+0

È perché le stringhe devono essere sfuggite come sopra. Ho appena migliorato la mia risposta. – Sliq

+0

Grazie mille, questo ha fatto il trucco! Apprezzo molto l'aiuto di tutti! – user1504463

+0

"Ciò accade quando il risultato non è un risultato (ma un" falso ")." Questo mi ha davvero aiutato nel debugare in pochi secondi. – madhuspot

4

Si sta citando la propria istruzione SQL che sta rendendo il testo delle variabili al posto delle variabili.

$sql = "SELECT * 
    FROM $usertable 
    WHERE PartNumber = $partid"; 
11
mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given 

Ciò significa che il primo parametro è stato passato è un valore booleano (vero o false).

Il primo parametro è $result ed è false perché nella query è presente un errore di sintassi.

" ... WHERE PartNumber = $partid';" 

Non si dovrebbe mai includere direttamente una variabile richiesta in una query SQL, altrimenti gli utenti sono in grado di iniettare SQL nelle query. (Vedere SQL injection.)

Si dovrebbe sfuggire la variabile:

" ... WHERE PartNumber = '" . mysqli_escape_string($conn,$partid) . "';" 

O meglio, utilizzare Prepared Statements.

+0

http://www.macaerospace.info/inventory/test?part=1 funziona correttamente quando si cerca solo un numero | http://www.macaerospace.info/inventory/test?part=PN123 non funziona e mi dà l'errore booleano | Inoltre, ho ricevuto un errore T-VARIABILE durante l'inserimento della stringa di escape. La sicurezza non è un problema enorme per me in questo momento mentre sto solo cercando di farlo funzionare prima – user1504463

0

Cosa succede nel codice se $usertable non è una tabella valida o non include una colonna Numero parte o parte non è un numero.

si deve fuggire $ partid e anche leggere il documento per mysql_fetch_assoc() in quanto può restituire un valore booleano

2

MySQLi fa uso di programmazione orientata agli oggetti.Provare a utilizzare questo approccio, invece:

function dbCon() { 
     if($mysqli = new mysqli('$hostname','$username','$password','$databasename')) return $mysqli; else return false; 
} 

if(!dbCon()) 
exit("<script language='javascript'>alert('Unable to connect to database')</script>"); 
else $con=dbCon(); 

if (isset($_GET['part'])){ 
    $partid = $_GET['part']; 
    $sql = "SELECT * 
     FROM $usertable 
     WHERE PartNumber = $partid"; 

    $result=$con->query($sql_query); 
    $row = $result->fetch_assoc(); 

    $partnumber = $partid; 
    $nsn = $row["NSN"]; 
    $description = $row["Description"]; 
    $quantity = $row["Quantity"]; 
    $condition = $row["Conditio"]; 
} 

fatemi sapere se avete domande, non ho potuto testare questo codice in modo che potrebbe essere necessario tripple controllarlo!

+1

La tua query SQL non è valida. Puoi 'NOT' usare le variabili in una singola stringa di quotazione – Twister1002

Problemi correlati