[MySQL] Solito errore #1064 con poca comprensione

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:

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
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
 

MaryDB

Nuovo Utente
23 Nov 2017
17
0
1
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

MaryDB

Nuovo Utente
23 Nov 2017
17
0
1
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

MaryDB

Nuovo Utente
23 Nov 2017
17
0
1
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.
 

MaryDB

Nuovo Utente
23 Nov 2017
17
0
1
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 */;
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

MaryDB

Nuovo Utente
23 Nov 2017
17
0
1
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).
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

MaryDB

Nuovo Utente
23 Nov 2017
17
0
1
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
*/
?>
 

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
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
Autore Titolo Forum Risposte Data
K form Inserimento record mysql PHP 2
P Mysql lento a cancellare MySQL 1
P Codifica caratteri speciali mysql php PHP 0
N MAX() + ADD_DATE - per update su Mysql MySQL 0
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
W MySQL ciclo in SELECT MySQL 0
L Mysql gestionale multipiattaforma MySQL 0
W MySQL SELECT list dinamica MySQL 0
M utilizzo mysql in nodejs - crea createdAt e updateAt MySQL 1
T colonne di tabelle mysql ordinate MySQL 0
M Sintassi "personalizzata" per mysql workbench? MySQL 0
A Mysql MySQL 0
F Ricreare struttura php+mysql su Xampp Apache 0
M Array associativi php su 2 campi mysql PHP 10
Z Controllo giorni MYSQL PHP 0
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
L Mysql: Nascondere le pagine dopo una ricerca PHP 1
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
S problema con recupero dati tabella mysql PHP 2
E Progressbar estrazione dati da tabella mySQL Ajax 9
Z MySql injection PHP PHP 1
D controllare valore in tabella mysql PHP 0
A pulsante di update campo mysql con javascript Javascript 2
R Tutto su utf-8 ma ancora problemi con i caratteri speciali in mysql MySQL 1
T differenza fra mysql xampp e un mysql server Database 0
R Importazione csv su mysql tramite array PHP 2
Z Problema con INT MySQL PHP 1
Z Problema database MySQL con XAMPP PHP 0
D problema php mysql PHP 1
D problema php mysql PHP 1
N Server mysql non raggiungibile da connessione esterna MySQL 1
B Crea pdf da tabella mysql "ultima riga modificata" MySQL 4
D evitare di inserirre duplicati in mysql PHP 4
L salvare codice html in mysql PHP 3
L Google chart php mysql PHP 2
S Gestire scelta dropdown con dati da Mysql PHP 2
K cron job mysql PHP 3
elpirata Query per leggere dati da una tabella mysql e mostrarli a video in base a parametri passati tramite GET PHP 5
R Errore UPDATE tabella mysql PHP 1
R Caricamento immagine su cartella remota + mysql PHP 3
D Emoji in mysql Database 0
L Aiuto per programma web php/mySQL PHP 2
S Problema esportazione tabelle Mysql in Excel PHP 0
S Cancellare una riga MYSQL PHP 1
L Ricerca valore mysql e incremento PHP 73
G database mysql contengono informazioni ? MySQL 0
G Testo in mysql format 3 MySQL 0

Discussioni simili