[MySQL] Solito errore #1064 con poca comprensione

  • Creatore Discussione Creatore Discussione MaryDB
  • Data di inizio Data di inizio

MaryDB

Nuovo Utente
23 Nov 2017
17
0
1
Ciao,
ho letto molti thread (anche su altri forum) ma non riesco proprio a decifrare il mio errore. Ho guardato le eventuali reserved words, poi gli esempi di utilizzo della query LIMIT, ma niente, non riesco proprio a venirne a capo.
Questa è la query che faccio :

SELECT col1,col2,col3,col4 FROM tab2 WHERE var1='".$pippo."' AND var2=".$pluto.$paper." AND number <= ".$ciccio." ORDER BY ".$order." ".$go." LIMIT ".$lim."

e l'errore è questo : #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '".$lim."' at line 1

Ho provato ad utilizzare gli apici per la variabile LIMIT ma niente, ho aggiunto eventualmente le ( ) per la query ORDER BY ma niente.
Probabilmente non riesco a vedere io l'errore, per questo chiedo lumi a voi.

Grazie.


Modifica : correzione nome variabile
 
Ultima modifica:
PHP:
"SELECT col1,col2,col3,col4 FROM tab2 WHERE var1='".$pippo."' AND var2=".$pluto.$paper." AND number <= ".$ciccio." ORDER BY ".$order." ".$go." LIMIT ".$lim
noto che $pippo lo hai messo tra apici, non lo hai fatto per $pluto.$paper e per $ciccio
le variabili alfanumeriche devono essere messe tra apici, le numeriche no, nulla mi permette di dirimere la loro qualità

noto anche che non hai messo la virgola tra i nomi delle colonne ....".$order." ".$go."....
probabilmente andava scritta ....".$order.",".$go."....

da ultimo l'errore riporta,
for the right syntax to use near '".$sr."' at line 1
ma nella tua query $sr non esiste !

è difficile interpretare i problemi che pùò presentare una query scritta in questo modo,
per capire meglio, sarebbe opportuno tu mettessi un'istruzione "echo" della variabile che contiene la query in modo da vederla come si presenta per l'esecuzione
quindi, in un eventuale prossimo post, posta la query "finita"

ps, i tag usati per postare il codice, ti aiutano a "leggere" eventuali errori di sintassi presenti nel codice stesso
 
Ciao Marino51,
effettivamente ho dimenticato di aggiornare la query, in quanto .$sr. è l'ultimo parametro .$lim.
Ho fatto un pò troppe prove, cambiando spesso nome alle variabili (pensando ad un errore di words non permesse, e poi ho postato la query non aggiornata.
Di fatto questa è la query con il valore delle variabili :
PHP:
$pippo=$s[4];
$pluto=intval($valnum);
$paper="";
$ciccio=$s[12];
$order="number";
$go="ASC";
$lim=intval($valnum2);

SELECT col1,col2,col3,col4 FROM tab2 WHERE var1='".$pippo."' AND var2=".$pluto.$paper." AND number <= ".$ciccio." ORDER BY ".$order." ".$go." LIMIT ".$lim."

Provando anche con gli apici, sempre stesso errore :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''".$lim."'' at line 1
 
Ciao
prova così
PHP:
$va2=$pluto.$paper;//se è un numero non mettere poi gli apici, ma scritta così mi sa che è una stringa
$or=$order." ".$go;// è così o intendevi ORDER BY $order, $go ?
$query="SELECT col1,col2,col3,col4 FROM tab2 WHERE var1='$pippo' AND var2='$va2' AND number <= $ciccio ORDER BY $or LIMIT $lim";
//poi metti un bel var_dumo
var_dump($query);// e vedi se viene scritta come dovrebbe
 
Ciao,
facendo partire la query su phpMyAdmin oltre a segnalarmi questi 3 errori (che spariscono se utilizzo le " ") :
  1. Unexpected character. (near "$" at position 87)
  2. Unexpected character. (near "$" at position 104)
  3. Unexpected character. (near "$" at position 114)
ho questo nuovo errore :
#1327 - Undeclared variable: $lim

Informo che sono su MariaDB 10.1
 
ciao
intanto per la varibile $lim, probabilmente non l'hai valorizzata prima di usarla.
poi per phpmyadmin sono anni che non lo uso direttamente, accedo sempre via script php, comunque se scrivi direttamente la query in phpmyadmin credo, ma può essere una cavolata, che
1) non dovresti scrivere le variabili ma il loro valore
2) phpmyadmin potrebbe interpretare gli apici come fa php esempio
PHP:
$pinco="pallo";
echo "scrivo $pinco";//output -> scrivo pallo
echo 'scrivo $pinco';//output -> scrivo $pinco
quindi, se è così, è logico che usando gli apici singoli trovi una $ che non ci dovrebbe essere
 
Ciao,
ho ricontrollato il codice e la variabile è valorizzata. Inoltre con phpMyAdmin posso testare la query anche senza valori ;-).
E si, interpreta gli apici come php, ed infatti, nel mio primo messaggio, la query li ha tutti, ma ho l'errore #1064 sull'ultima variabile, come se mancasse qualche " o ' prima di questa, ma non sono ancora riuscito a capire cosa, dato che mi sembra sia scritta correttamente.
 
Ciao,
eccomi qui, dopo quasi una settimana di test vari (ed altre problematiche). Questo è il dump :

Codice:
DROP TABLE IF EXISTS `tab2`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tab2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `var1` varchar(12) DEFAULT NULL,
  `var2` int(11) DEFAULT NULL,
  `col1` varchar(255) DEFAULT NULL,
  `col2` varchar(255) DEFAULT NULL,
  `col3` int(11) DEFAULT NULL,
  `col4` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
 
ciao
ti riporto sinteticamente quello che hai fatto
PHP:
<?php
/*
CREATE TABLE `tab2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `var1` varchar(12) DEFAULT NULL,
  `var2` int(11) DEFAULT NULL,
  `col1` varchar(255) DEFAULT NULL,
  `col2` varchar(255) DEFAULT NULL,
  `col3` int(11) DEFAULT NULL,
  `col4` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`)
*/
$pippo=$s[4];
$pluto=intval($valnum);
$paper="";
$ciccio=$s[12];
$order="number";
$go="ASC";
$lim=intval($valnum2);
$q="
SELECT col1,col2,col3,col4 FROM tab2 WHERE var1='$pippo' AND var2=".$pluto.$paper." AND number <= ".$ciccio." ORDER BY ".$order." ".$go." LIMIT ".$lim."
";
?>
1) quando scivi $pluto.$paper dove $pluto=intval($valnum)e $paper=""; nella prima ($pluto) hai si un intero, ma la congiunzione $pluto.$paper trasforma il tutto in una stringa mentre il campo var2 è settato ad intero, a che ti serve aggiungere ad un intero una stringa vuota?
prova questo mini
PHP:
<?php
echo "<pre>";
$pluto=1;
var_dump($pluto);// output int(1)
$paper="";
var_dump($pluto.$paper);//uotput string(1) "1"
echo "</pre>";
?>
2) poi fai number<=$ciccio, ma nella tabella non vedo un campo che si chiama number, analogo discorso per ORDER BY
 
Ciao, al punto 1 in effetti i due valori assieme potrebbero assumero carattere di stringa (anche se nel mio caso non è così, in quanto sono due numeri). Il valore $paper non è conosciuto, in quanto viene passato dall'utente nel momento in cui lo usa (e non è detto che venga usato, è opzionale).
 
ciao
attento
PHP:
<?php
echo "<pre>";
$pluto=1;
var_dump($pluto);// output int(1)
$paper=2;
var_dump($paper);// output int(2)
var_dump($pluto.$paper);//uotput string(2) "12"
echo "</pre>";
?>
poi se non viene valorizzato sempre stringa risulta
 
Ciao,
grazie per la tua precisione. Ma a questo punto ti chiedo: nel momento in cui faccio una richiesta solo per $pluto (che sarà un integer) va bene lo stesso anche se setto var2 come varchar(12) ?

Inoltre sembra che ho scoperto l'arcano, o meglio ho verificato che se utilizzo un valore numerico dopo LIMIT non ho più nessun errore.
PHP:
LIMIT ".$lim."  -> errore
LIMIT 5 -> funziona

Possibile che debba per forza passargli un valore senza che questo venga passato in un secondo momento ?
Leggendo la documentazione su MariaDB trovo questo : https://mariadb.com/kb/en/library/limit/ e non parla di eventuali limitazioni.
Sto capendo male?
 
ciao
si devi passargli un valore LIMIT lo aspetta, potresti fare così
PHP:
<?php
//...
$limite="";
if($lim >0){$limite=" LIMIT ".$lim;}
//e poi la query, non la scrivo tutta
$q="SELECT..... $limite";
/*
se lim > 0, es 8, la query risulta "SELECT ... LIMIT 8"
se non esiste "SELECT ..."
quindi la sintassi viene rispettata
*/
?>
 
PHP 5 ha una tipizzazione dinamica, se tenti di fare la somma tra un intero e una stringa ti darà un intero, o almeno dovrebbe :)
Per risolvere il problema basta fare $limit = 10 + (int)$altroValore;
Dove 10 è sicuramente un intero e $altroValore può essere una stringa.
Attenzione perché 10 è intero, mentre "10" o '10' sono stringhe; per portarle a interi o usi intval() o usi il casting, ovvero metti davanti alla stringa ( o alla variabile) tra parentesi il tipo che vuoi ottenere, in questo caso (int) per intero.
Anche se il manuale dice che $limit = 10 + "5 ciao bello!"; da un intero uguale a 15 ( http://it2.php.net/manual/it/language.types.type-juggling.php ) io preferisco sempre fare il casting, anche perché puoi controllare facilmente il valore ritornato, specie se questo viene da un utente ( e tu mi pare di capire non fai nemmeno uno straccio di verifica sui valori inseriti ).

Se invece hai il 7 del PHP la storia è diversa perché è più fortemente tipizzato, ma allora avresti altri errori propri del PHP e non mi pare il tuo caso.
 

Discussioni simili