[PHP] Perchè non mi esegue la query?

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao a tutti. Apro questa discussione perchè vorrei chiedervi un aiutino in merito ad una query.
Vi spiego il problema.
Ho una tabella mysql così composta:
id ---> intero (3); chiave primaria; Auto Incr.
giorni ---> date;
dati ---> double.

Nella tabella devo selezionare i dati in un intervallo di tempo (ad esempio dal giorno 3 al giorno 6). Se non considero l'intervallo di tempo e seleziono tutti i dati è ok; infatti faccio in questo modo:
Codice:
$sql="SELECT * FROM tabella ORDER BY id";
$sth = mysql_query($sql) or die ('Query fallita: ' . mysql_error());
Se invece voglio selezionare i dati nell'intervallo di tempo faccio in questo modo:
Codice:
$query=mysql_query("SELECT MIN(id) AS min, MAX(id) AS max FROM tabella WHERE $campo_x=$minore OR $campo_x=$maggiore");
$riga=mysql_fetch_assoc($query);
$id_min=$riga['min'];
$id_max=$riga['max'];
$sql="SELECT * FROM tabella WHERE id>=$id_min AND id<=$id_max ORDER BY id";
$sth = mysql_query($sql) or die('Query fallita: ' . mysql_error());
Facendo in questo modo mi scrive 'Query fallita' e non capisco il perchè.
Però ho notato una cosa: se la colonna giorni la sostituisco con una colonna di tipo "intero" o "double" il codice mi funziona perfettamente.
Secondo voi dove può essere il problema?
Ciao, grazie.
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
Potresti postare qualche esempio di riga presente in tabella?

Tra l'altro dici che la tabella è composta da ID, GIORNI, DATI e nella query poni la condizione con un campo chiamato CAMPO_X, per cui, volendo fare i pignoli, questa query ti fallisce necessariamente in quanto non hai alcun CAMPO_X, ma solamente i campi id, giorni, dati.

Altra cosa, già che ci sei puoi dirci qual è il mysql_error che compare.
 

Jonn

Utente Attivo
29 Dic 2012
352
3
18
Pistoia
Prima di tutto controlla che ci sia l'accesso al DB, perchè da quello che hai scritto sembra che non si colleghi proprio (vedi l'errore che ti restituisce).
Quando si esegue una Query su un DB bisogna sempre aprire la connessione prima ed è buona norma chiuderla non appena le modifiche sono finite, sempre:

Dichiaro tutti i parametri dentro delle variabili per facilitarne il richiamo durante la scrittura del sorgente:
PHP:
    $DBMS_host = "db_host";//dichiaro il nome host del DBMS,
    $DBMS_username = "db_username";//dichiaro il nome utente del DBMS,
    $DBMS_password = "db_password";//dichiaro la password del DBMS,
    $DBMS_dbname = "db_name";//dichiaro il nome del database,
    $DBMS_dbtab = "db_tab";//dichiaro il nome della tabella utenti del database
Dichiaro i parametri di connessione al DB:
PHP:
    $connessione = new PDO("mysql:host=$DBMS_host;dbname=$DBMS_dbname", $DBMS_username, $DBMS_password);//dichiaro la stringa di connessione al DB contenente tutti i parametri,
Definisco la query da eseguire sul DB, e la eseguo:
PHP:
    $query = $connessione->prepare ("SELECT username FROM $DBMS_dbtab WHERE username='$user_check'");//preparo la query SQL sulla tabella per trovare riscontro nel database
    $query->execute();//e la eseguo,
Una volta finite le operazioni sul DB, esco azzerando la variabile che contiene i parametri di connessione e rimando l'utente alla index:
PHP:
     $connessione = null;//chiudo la connessione al DB.
     header('Location: index.php');//e redireziono l'utente alla homepage.
Questi sono i comandi essenziali, se imposti correttamente i parametri questa funziona garantito e non ci sono errori, è buona norma poi quando si fanno tante operazioni commentare il sorgente in modo da renderlo riconoscibile a colpo d'occhio anche a chi non l'ha creato ma ci deve lavorare.
 

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao a tutti e grazie per avermi risposti così velocemente.
Per Adeknite
Ti riporto alcune righe della tabella:
Codice:
id |            giorni               |             dati            |              ora          |
1            2016-07-16                       0.40                       13:13:29
2            2016-07-16                       0.42                       13:23:24
3            2016-07-16                       0.39                       13:33:25
...                 ...                                 ...                              ...
20          2016-07-17                       0.46                       06:56:46
Scusa ma prima mi ero dimenticato della colonna "ora".
Per quanto riguarda $campo_x, questo non è un campo della tabella ma è un drop-down box presente nel form in cui sono riportati i nomi di tutte le colonne della tabella (id-giorni-dati-ora).$minore e $maggiore sono due drop-down box in cui sono riportati i giorni e l'utente sceglie l'intervallo in cui effettuare la selezione.
L'errore che mi compare è questo:
Query fallita: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND id<= ORDER BY id' at line 1

Per Jonn
Per quanto riguarda l'accesso al database sono certo che questo avviene; avrei avuto qualche dubbio se dopo aver fatto quella modifica che ho scritto nel primo post continuava a darmi errore.
Sulle altre cose che mi hai detto ne farò tesoro e ti ringrazio di avermele dette.

Ciao.
 
Ultima modifica:

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
Non riesco a fare le dovute verifiche al momento, però dall'errore sembra che non ti legga la variabile php e quindi produca un errore di sintassi.

Prova a racchiudere le variabili PHP tra apici (e.g. "SELECT * FROM table WHERE id = '$id';"), oppure, ancora meglio, cambia API, passando dalle ormai deprecate funzioni mysql_ a PDO, in cui hai la possibilità di usufruire delle prepared statements e della concatenazione delle variabili a runtime, attraverso un array.
 

Jonn

Utente Attivo
29 Dic 2012
352
3
18
Pistoia
Ma scusami, te lo dice chiaro e tondo dov'è l'errore:

Query fallita: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND id<= ORDER BY id' at line 1

Query fallita: Hai un errore nella sintassi SQL; controlla il manuale corrispondente alla tua versione di MySQL Server per la giusta sintassi da usare vicino "AND id<= ORDER BY id" alla linea 1.

Se vedi dopo l'uguale non c'è niente perchè la variabile o non esiste, o non è settata o ha valore NULL perchè vuota, quindi devi controllare in che modo assume un valore quella variabile, poi è logico che se quella variabile è INT e la confronti con un campo di tipo DATE non te la troverà mai, INT sono numeri interi, non date.
Come dice AdeKnite anche io penso che sia solo quello il problema a questo punto: visto che nell'output la variabile non c'è è normale che ti "sconquassa" il resto della sintassi, prova ad iniziarlizzarla per esempio a "0" e gli cambi valore quando devi fare la query o comunque prima (l'importante è che abbia un valore).
In ognicaso prova a scrivere quel comando in questo modo:
PHP:
$sql="SELECT * FROM tabella WHERE id >= ".$id_min." AND id <= ".$id_max." ORDER BY id";
metti anche gli spazi, che nel tuo non ci sono, non si sa mai.
Ciao
 

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao a tutti, scusate se non ho risposto subito ma sono stato un pò impegnato con il lavoro.
Per Jonn
Ho provato a scrivere il comando nel modo in cui mi hai detto, ma niente, non funziona.

Per AdeKnite
Ho provato a scrivere quel codice sfruttando il PDO ma, francamente ho molta difficoltà e volevo chiederti se potevi aiutarmi (se mi aiuta anche Jonn sarei ancora più felice).

Ciao, grazie.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
var_dump() chi era costui?
il var_dump è una buona risorsa in fase di debuggazione, ne metti uno prima e guardi cosa ti da
PHP:
var_dump($id_min,$id_max);
$sql="SELECT * FROM tabella WHERE id >= ".$id_min." AND id <= ".$id_max." ORDER BY id";
se ti riporta null o valori che non dovrebbero esserci (es $id_min > $id_max) non è colpa di mysql
 

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao Borgo Italia.
Ho provato quello che mi hai scritto e mi genera questo errore:

NULL NULL Query fallita: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND id<= ORDER BY id' at line 1

Ciao
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
il var_dump ti trestituisce null quindi le due variabili risultano vuote, cioè senza valore. Per la query suggerisco una modifica negli apici e poi prova a fare il var_dump anche della wselect per avere la certezza.



Codice:
$sql="SELECT * FROM tabella WHERE id >='  ".$id_min." ' AND id <=  ' ".$id_max." ' ORDER BY id";
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
Le variabili che utilizzi sono tutte valorizzate? Hai provato a stamparle per vedere se vengono valorizzate correttamente?

Ti allego il codice che sfrutta il PDO (ovviamente devi adattare i parametri della connessione, oltre a definire le variabili $campo_x, $minore, $maggiore, contenute nella prima query, le quali dovrebbero arrivarti dal form).

PHP:
<?php

// ADATTARE I PARAMETRI DI CONNESSIONE
$servername = "localhost"; // nome o ip del server
$username = "root"; // username
$password = ""; // password
$dbname = "prova"; // nome del database


///////////////////////////////////////////////////////////////////////////
$str  = 'mysql:host='.$servername.';dbname='.$dbname.';charset=utf8mb4';
$opt = array(
    PDO::ATTR_EMULATE_PREPARES         => FALSE,
    PDO::ATTR_ERRMODE                => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE     => PDO::FETCH_ASSOC
    );
try {
    $conn = new PDO($str,$username,$password,$opt);
} catch(PDOException $ex) {
    echo "Errore!";
///////////////////////////////////////////////////////////////////////////



// definisco la query, utilizzando '?' come segnaposto
$query = "SELECT MIN(id) AS min, MAX(id) AS max FROM tabella WHERE ? = ? OR ? = ?";
//preparo la query
$stm = $conn->prepare($query);
// eseguo la query, sostitutendo i ? con le variabili passate
// all'interno dell'array
$stm->execute(array($campo_x,$minore,$campo_x,$maggiore));
// estraggo i risultati
$riga = $stm->fetch(PDO::FETCH_ASSOC);

//salvo $id_min e $id_max
$id_min=$riga['min'];
$id_max=$riga['max'];


// definisco la seconda query
$query2 = "SELECT * FROM tabella WHERE id >= ? AND id <= ? ORDER BY id";

//preparo la query
$stm = $conn->prepare($query2);

// eseguo la query, sostitutendo i ? con le variabili passate
// all'interno dell'array
$stm->execute(array($id_min,$id_max));

// estraggo i risultati
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
    echo $row['id'].'<br>';
}

// chiudo la connessione
$conn = null;
?>
 

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao AdeKnite. Grazie per il codice che mi hai scritto.
Con il tuo codice tu stampi a video l'elenco dell'id. Ho provato a modificare leggermente il tuo codice perché non è questo che devo fare. Quello che devo fare è costruire un grafico "google chart" in cui sull'asse x ho il tempo espresso in giorni (esempio: 2016/08/11) e sull'asse y un altro elemento scelto dall'utente.
Ti riporto il codice che ho modificato ma purtroppo mi genera questo errore: "Cannot read property 'CB' of undefined".

Codice:
if (isset ($_POST['aggiorna']))
    {
    // se nell'asse "x" non è riportato il tempo e l'utente cliccla il bottone "aggiorna" genera un messaggio di errore
    if (empty($_POST['data_inizio']) || empty($_POST['data_fine']))
    {
      echo "Attenzione: Non è possibile utilizzare la funzione \"Aggiorna Grafico\" in quanto sull'asse x non è stato selezionato il tempo. Per visualizzare

nuovamente il grafico si prega di cliccare su \"Crea / Modifica grafico\".";
      exit();
    }
    
    // faccio la connessione al server e al database
    $servername = "localhost"; // nome o ip del server
    $username = "root"; // username
    $password = ""; // password
    $dbname = "meco_monitoraggi"; // nome del database

    $str  = 'mysql:host='.$servername.';dbname='.$dbname.';charset=utf8mb4';
    $opt = array(
    PDO::ATTR_EMULATE_PREPARES         => FALSE,
    PDO::ATTR_ERRMODE                => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE     => PDO::FETCH_ASSOC
    );
    try
    {
      $conn = new PDO($str,$username,$password,$opt);
    }
    catch(PDOException $ex)
    {
      echo "Errore!";
    }
  
    // seleziono il valore di "minore" e "maggiore"
    $minore = $_POST['data_inizio'];
    $maggiore = $_POST['data_fine'];
  
    // seleziono l'id più piccolo e l'id più grande
    $query = $conn->prepare("SELECT MIN(id) AS min, MAX(id) AS max FROM $campo_monit WHERE ?=? OR ?=?");
    $query->execute(array($campo_x,$minore,$campo_x,$maggiore));
  
    // estraggo i risultato e li salvo
    $risultati = $query->fetch(PDO::FETCH_ASSOC);
  
    $id_min=$risultati['min'];
    $id_max=$risultati['max'];
  
    // seleziono tutto dalla tabella dove id>=id_min e id<=id_max
    $query1 = $conn->prepare("SELECT * FROM $campo_monit WHERE id>=? AND id<=? ORDER BY id");
    $query1->execute(array($id_min,$id_max));
  
    // "costruisco" indicando i nomi delle colonne della tabella - una deve essere in formato stringa (asse x) ed una in formato number (asse y)
    $table['cols'] = array(
    array('label' => $campo_x, 'type' => 'string'),
    array('label' => $campo_y, 'type' => 'number')
    );
    $rows = array();
  
    if ($query1)
    {
      while ($r = $query1->fetch(PDO::FETCH_ASSOC))
      {
        $temp = array();
        $temp[] = array('v' => (string) $r[$campo_x]);
        $temp[] = array('v' => (float) $r[$campo_y]);
        $rows[] = array('c' => $temp);
      }
    }
  
    $table['rows'] = $rows;
    $jsonTable = json_encode($table);
  // chiudo la connessione
    $conn = null;
  }
Secondo te dove sbaglio?
Ciao, grazie
 
Ultima modifica: