2009-09-26 27 views
6

Ho uno script PHP e per qualche ragione mysql continua a considerare il valore da selezionare/inserire come colonna. Ecco un esempio della mia query SQL:MySQL: colonna sconosciuta in cui clausola errore

$query = mysql_query("SELECT * FROM tutorial.users WHERE (uname=`".mysql_real_escape_string($username)."`)") or die(mysql_error()); 

che si trasforma in:

SELECT * FROM tutorial.users WHERE (uname=`test`) 

L'errore era:

colonna 'test' sconosciuta in 'dove clausola'

Ho anche provato:

SELECT * FROM tutorial.users WHERE uname=`test` 

risposta

9

Strano? Come mai? Dice esattamente cosa c'è che non va. Non c'è una colonna 'test' nella tua tabella. Sei sicuro di avere il tavolo giusto? "tutorial.users"? Sei sicuro che la tabella non abbia un nome diverso? Forse volevi dire fare

SELECT * from users WHERE uname = 'test'; 

Bisogna fare riferimento solo il nome della tabella, non il database .. supponendo che il database è denominato tutorial

+0

opere ora, grazie – user169551

+0

Sì penso che lui sta aggiungendo il nome del database nella query .. o forse vuole per selezionare tutorial.users da parte degli utenti in cui 'test' = uname; – halocursed

+0

np. non dimenticare di selezionare una risposta :) e benvenuto su Stackoverflow. –

34

In MySQL, backticks indicano che un identificatore è un nome di colonna. (Altri RDBMS usano parentesi o virgolette per questo).

Quindi la tua query era, "dammi tutte le righe in cui il valore nella colonna denominata 'uname' è uguale al valore nella colonna denominata 'test'". Ma dal momento che non c'è una colonna chiamata test nella tua tabella, ottieni l'errore che hai visto.

Sostituire i backtick con virgolette singole.

+4

oh, questa è la vera spiegazione;) –

4

esempio:

$uname = $_POST['username']; 
$sql="SELECT * FROM Administrators WHERE Username LIKE '$uname'" 

Nota le virgolette singole intorno al $ uname. Quando si echo la query, questo è l'output-

SELECT * FROM Administrators WHERE Username LIKE 'thierry' 

Tuttavia, se si dimentica la citazione intorno alla variabile $ uname nella query, questo è quello che vi get

SELECT * FROM Administrators WHERE Username LIKE thierry 

su MySQL server, le 2 query sono diverse. thierry è la stringa di input e incapsulata correttamente tra virgolette, dove, come nella seconda query, non lo è, il che causa un errore in MySQL.

Spero che questo aiuta e scusate la mia englis che non è molto buona

+0

Ottima risposta. Mi ha aiutato a capire meglio quando usare 'e quando no. Grazie –

0

Ho avuto lo stesso problema e si è rivelato essere un errore di battitura. Il mio messaggio di errore era:

Unknown column 'departure' in 'where clause' 

ho controllato che molto colonna mio tavolo e si scopre che, avevo scritto come "depature" e non "di partenza" nella tabella, quindi, lanciando il messaggio di errore.

seguito ho cambiato la mia domanda a:

Unknown column 'depature' in 'where clause' 

e ha funzionato!

Quindi il mio consiglio è chiaramente, ricontrolla correttamente il nome della colonna.

Spero che questo abbia aiutato.

0

Ho anche affrontato il problema della "Colonna sconosciuta in where clausola" quando si esegue la seguente riga di comando da Linux (bash).

mysql -u support -pabc123 -e 'select * from test.sku where dispsku='test01' ; ' 

Questo è quello che ho ottenuto

ERROR 1054 (42S22) at line 1: Unknown column 'test01' in 'where clause' 

ho dovuto sostituire le virgolette singole 'TEST01' con le doppie virgolette "test01". Ha funzionato per me. C'è una differenza su come e come stai eseguendo query SQL.

Quando si assegna un valore a una variabile in uno script e in seguito, utilizzando tale variabile in una istruzione sql che deve essere eseguita dallo script, c'è una leggera differenza.

Se supponiamo variabile è

var=testing 

e si desidera passare questo valore all'interno di script per mysql, citazioni quindi un'unica opera.

select '$var' 

Così diversi motori potrebbero valutare i backtick e le virgolette in modo diverso.

Questa è la mia query che ha funzionato dalla riga di comando di Linux.

mysql -u support -pabc123 -e 'select * from test.sku where dispsku="test01" ; ' 
Problemi correlati