[PHP] Selezione dati con riferimento ad altra colonna tabella

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
Ciao a tutti.
Con questa discussione vi chiedo un aiuto perchè non so come muovermi.
Vi spiego cosa vorrei fare. Ho una tabella formata da due colonne chiamate 'id' e 'colonna1' mentre nella pagina .php ci sono due input text chiamati 'valore1' e 'valore2' e un bottone.
Negli input text 'valore1' e 'valore2' verranno inseriti i valori entro i quali saranno selezionati i dati di 'colonna1'.
Quello che vorrei fare è selezionare i dati della 'colonna1' dal 'valore1' al 'valore2', ma la selezione la vorrei effettuare facendo riferimento all'id.
Esempio:
id colonna1
1 dato1
2 dato2
3 dato3
4 dato4
5 dato5

Se nella pagina .php nell'input text 'valore1' scrivo 'dato2' e nell'input text 'valore2' scrivo 'dato4' mi deve selezionare la 'colonna1' dall'id 2 all'id 4 e non da 'dato2' a 'dato4'.
Come faccio?
Ciao, grazie
 
ciao
forse non ho capito bene ed inoltre non so cosa siano i valori dato1, dato2 ecc.., numeri stinge, date? sono ordinati?sono sempre diversi?
sempre se non ho capito male forse devi fare due query considerando che i vari dati in colonna1 siano tutti uno diverso dall'altro, ti schematizzo
questo se i valori sono uno diverso dall'altro
PHP:
<?php
//dati di connessione
$query_1=mysqli_query($conn,"SELEC id FROM tabella WHERE colonna1='valore1' OR colonna='valore2' ORDER BY id");
while($riga=mysqli_fetch_assoc($$query_1){
    //qundi essendo uno diverso dall'altro estraggo due id
    $id_estratti[]=$riga['id'];
}
//e faccio la seconda query
$query_2=mysqli_query($conn,"SELECT * FROM tabella WHERE id>=".$id_estratti[0]." AND id<=".$id_estratti[1]." ORDER BY id");
while($riga=mysqli_fetch_assoc($query_2){
    echo $riga['id'].") valore ". $riga['colonna1']."<br>";
}
se invece in colonna1 ci sono valori ripetuti il discorso si complica in quanto col metodo di cui sopra ottine più di due id
//....
?>
 
Ciao borgo italia. Innanzi tutto grazie per la risposta.
Per quanto riguarda la tabella la 'colonna1' sono numeri, sono ordinati ma non sono in grado di dire se sono sempre diversi in quanto la tabella riceve i dati da un macchinario e i vari valori spostano tra loro di pochissimo. Quindi c'è la possibilità che qualche valore si può ripetere.
Ciao.
 
ciao
prova a vedere se questo fa il caso tuo, fai eventualmente delle prove
1) ho fatto una tabella chiamata macchinario con due campi
Codice:
id int(3) autoincrement primarykey
colonna1 float(3,2)// ho usato float con due decimali
vedi tu quanti te ne servono, ho messo con 3,2 tre interi e due decimali, attento il numero di interi >= numero di decimali
2) l'ho riempita casualmente con questo script
PHP:
<?php
//attento mi veniva comodo usare msql, ma tu usa mysqli
$host = 'localhost';     //nome host
$username = 'root';      //user name
$password = 'password';  //password
$db = 'prove';            // nome data base
$conn = mysql_connect($host,$username,$password) or die (mysql_error());
$sel = mysql_select_db($db) or die (mysql_error());
//la riempio casulamente, la colonna1 con numeri che vanno da 0 a 0.999
for($k=0; $k<100; $k++){
    $caso=rand(0,999)/1000;//viene tre decimali ma essendo il campo colonna1 con due ottengo valori ripetuti
    $query="INSERT INTO macchinario(colonna1) VALUES($caso)";
    $ris=mysql_query($query);
}
echo "fine";
?>
3) poi con questo leggo
PHP:
<?php
//dati connessione come sopra
$valore1=0.50;//questi poi ti verranno da $_POST
$valore2=0.70;
//trovo il più piccolo e il più grande degli id che corrispondano ai valori inputati
$query="SELECT MIN(id) AS min, MAX(id) AS max FROM macchinario WHERE colonna1=$valore1 OR colonna1=$valore2";
$ris=mysql_query($query);
$riga=mysql_fetch_assoc($ris);
$id_min=$riga['min'];
$id_max=$riga['max'];
//estraggo i valori di colonna1 compresi tra quei due id SELECT * FROM tabella WHERE id BETWEEN 1 AND 10;
$query="SELECT * FROM macchinario WHERE id >= $id_min AND id <= $id_max ORDER BY id";
/* o anche così
$query="SELECT * FROM macchinario WHERE id BETWEEN $id_min AND $id_max ORDER BY id";
*/
while($riga=mysql_fetch_assoc($ris)){
    $id=$riga['id'];
    $valore=$riga['colonna1'];
    echo "a $id corrisponde il valore $valore<br>";
}
?>
guardando con phpmyadmin come ti è venuta la tabella e quanto ti riporta lo script dovresti vedere se fa il caso tuo
 
Ciao borgo italia.
Ho provato il codice che mi hai scritto (con qualche piccola modifica nella seconda parte) ma mi genera questo errore:
Query fallita: FUNCTION prove.MIN does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual.
Secondo te da cosa può dipendere?
Questo è il codice che ho scritto io.
PHP:
<?php

if (isset ($_POST['submit']))
{

// leggo i valori dei due input text

  $valoreMinimo = $_POST['valore_min'];

  $valoreMassimo = $_POST['valore_max'];

// connessione

  $con = mysql_connect ("localhost","root","") or die ("Connessione al server fallita! ".mysql_error());

  $db = mysql_select_db ("prove", $con) or die ("Connessione al database meco_monitoraggi fallita! ".mysql_error());

// seleziono l'id dalla tabella

  $query = "SELECT MIN (id) AS min, MAX (id) AS max FROM macchinario WHERE colonna1 = $valoreMinimo OR colonna1 = $valoreMassimo";

// faccio la query

  $sth = mysql_query($query) or die ('Query fallita: '.mysql_error()); // DA QUESTO RIGO MI GENERA L'ERRORE !!!!!

  $id_min = $riga['min'];

  $id_max = $riga['max'];

// estraggo i valori della colonna1

  $query="SELECT * FROM macchinario WHERE id >= $id_min AND id <= $id_max ORDER BY id";

// faccio il ciclo while

  while($riga=mysql_fetch_assoc($ris))
  {
    $id=$riga['id'];
    $valore=$riga['colonna1'];
    echo "a $id corrisponde il valore $valore<br>";
  }

}

?>
 
Ultima modifica di un moderatore:
ciao
togli quello spazio tra MIN e (id) e lo stesso tra MAX e (id)
PHP:
  $query = "SELECT MIN(id) AS min, MAX(id) AS max FROM macchinario WHERE colonna1 = $valoreMinimo OR colonna1 = $valoreMassimo";
poi manca la funzione di lettura
PHP:
$ris=mysql_query($query);
$riga=mysql_fetch_assoc($ris);// QUESTA
//.....
poi, non so come inputi i due valori, se li scrivi manualmente ti conviene verificarli prima di usarli con is_nan per vedere se sno numeri
 
Ciao borgo italia. Ho fatto le correzioni che mi hai detto e non mi genera più nessun errore ma al tempo stesso non mi produce nessun effetto. Se scrivo nei due input text un valore presente nel database e poi clicco sul bottone non succede assolutamente niente. Non so proprio come fare... :(
Comunque se vuoi ti riporto il codice corretto
Codice:
<?php

if (isset ($_POST['submit']))
{

// leggo i valori dei due input text

  $valoreMinimo = $_POST['valore_min'];

  $valoreMassimo = $_POST['valore_max'];

// connessione

  $con = mysql_connect ("localhost", "root","") or die ("Connessione al server fallita! ".mysql_error());

  $db = mysql_select_db ("prove", $con) or die ("Connessione al database meco_monitoraggi fallita! ".mysql_error());

// seleziono l'id dalla tabella

  $query = "SELECT MIN(id) AS min, MAX(id) AS max FROM macchinario WHERE colonna1 = $valoreMinimo OR colonna1 = $valoreMassimo";

// faccio la query

  $ris=mysql_query($query) or die ('Query fallita: '.mysql_error());

  $riga=mysql_fetch_assoc($ris);

  $id_min = $riga['min'];

  $id_max = $riga['max'];

// estraggo i valori della colonna1

  $query="SELECT * FROM macchinario WHERE id >= $id_min AND id <= $id_max ORDER BY id";

// faccio il ciclo while

  while($riga=mysql_fetch_assoc($ris))
  {
    $id=$riga['id'];
    $valore=$riga['colonna1'];
    echo "a $id corrisponde il valore $valore<br />";
  }

}

?>
Ciao, grazie
 
ciao
// estraggo i valori della colonna1
$query="SELECT * FROM macchinario WHERE id >= $id_min AND id <= $id_max ORDER BY id";
per caso non ti sei dimenticato la
$ris =mysql_query( $query)?
 
ciao
probabilmente devi buttare tutto quello che ti ho postato perchè secondo me contiene degli errori non tanto di script, ma di logica.
mettiamo che tu abbia una situazione del genere (metto due decimali ma se sono di più, non cambia nulla)
Codice:
id    |    colonna1
1    |    0.23
2    |    0.25
3    |    0.23
4    |    0.30
5    |    0.40
6    |    0.45
7    |    0.39
8    |    0.52
9    |    0.54
ecc....
1° errore
se imputi
minimo = 0.24
massimo = 0.32

la query non ti riporta nulla perche in colonna1 non esistono quei due valori
analogo discorso se uno esiste e l'altro no

2° errore
da quello che ho capito tu inputando i due valori vuoi estrarre gli id dei valori compresi tra i due valori inputati, giusto?
ora se inputi
minimo = 0.40
massimo = 0.54

ti estrae
id_minimo => 5
id_massimo => 9

quindi ti mostra i valori compresi tra i duei id corrispondenti ai valori inputati, ma se noti il valore corrispondente all'id=7 (che ti viene mostrato), ma 0.39 non rientra nel range che hai inputato

sempre se non ho capito male (per evitare il 1° e il 2° errore) se inputi

minimo = 0.40
massimo = 0.53

(come noti uno dei due valori non esiste) dovrebbe estrati solo questi
Codice:
5   |   0.40
6   |   0.45
8   |   0.52
è così?
se è cosi aspetta che ripenso al tutto
 
Ciao Borgo Italia. Riprendo il tuo esempio per spiegarti meglio il tutto.
1° errore
Quando imputo il valore minimo e massimo non inserisco valori a piacere come hai fatto tu (minimo=0.24| massimo=0.32), ma inserisco i valori che leggo nel database (ad esempio minimo=0.23| massimo=0.39). Di conseguenza i valori minimo e massimo esistono sempre perché prima li vado a leggere nel database.
2° errore
Se imputo un valore minimo=0.40 e un valore massimo=0.54 mi deve estrarre tutti i dati della colonna1 compresi dall'id 5 all'id 9. Quando faccio la "SELECT" non posso fare semplicemente riferimento alla colonna1 per un motivo: con i dati presenti in questo database sto realizzando un grafico Google chart. All'interno della pagina .php ho inserito due input text (chiamati valore minimo e valore massimo) e un bottone. Quando clicco il bottone modifico il range dei punti presenti nel asse x del grafico.Quindi se ho inserito un valore minimo=0.40 e un valore massimo=0.54 mi dovrà inserire i punti della colonna1 che vanno dall'id 5 all'id 9. Questo perché devo avere un aumento crescente o decrescente costante della colonna. Se ciò non avviene il grafico che mi genera è completamente sbagliato.

In conclusione, quello che devo fare è questo: se inserisco un valore minimo=0.40 e un valore massimo=0.54 devo estrarre tutti i dati presenti dall'id 5 all'id 9 e non dal valore 0.40 al valore 0.54; quindi quando estraggo i dati devo fare sempre riferimento all'id e non alla colonna1.
 
Ciao Borgo Italia. Ho inserito la query che mancava ma adesso proprio a quella query mi genera questo errore:
Codice:
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
allora, visto che oggi ho poco da fare, se puà servirti ti schematizzo come farei io
PHP:
<?php
//i dati di connessione
$host = 'localhost';  //nome host
$username = 'root';  //user name
$password = 'password';  //password
$db = 'prove';  // nome data base
$conn = mysql_connect($host,$username,$password) or die (mysql_error());
$sel = mysql_select_db($db) or die (mysql_error());

if(isset($_POST['invia'])){
   $minimo=$_POST['minimo'];
   $massimo=$_POST['massimo'];
   //faccio alcuni controlli secondo me essenziali
   $errore="";
   if($minimo=="" || $massimo==""){
     $errore.="devono essere inseriti entrambi i valori<br>";
   }
   if($minimo==$massimo){
     $errore.="i valori devono essere diversi<br>";
   }
   //questo potrebbe non essere un errore, ma modifico in modo da non avere possibili errori successivi
   if($minimo>$massimo){
     //cioe li rimetto nell'ordine giusto anche se inputati invertiti
     $tr=$massimo;
     $massimo=$minimo;
     $minimo=$tr;
   }
   if($errore !=""){
     //la stringa si è riempita quindi c'èstato un errore di input
     //quindi visualizzo l'errore e rimando al form es col tag meta, se non ti funziona devi usare un js
     echo $errore;
     echo "<meta http-equiv='Refresh' content='3; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
   }else{
     //trovo il min id e il max id
     $query=mysql_query("SELECT MIN(id) AS min, MAX(id) AS max FROM macchinario WHERE colonna1=$minimo OR colonna1=$massimo");
     $riga=mysql_fetch_assoc($query);
     $id_min=$riga['min'];
     $id_max=$riga['max'];
     //estraggo gli id e i valori corridpondenti
     $query=mysql_query("SELECT * FROM macchinario WHERE id >= $id_min AND id <= $id_max ORDER BY id");
     while($riga=mysql_fetch_assoc($query)){
       //e qui metto la visualizzazione perche non so che tipo di variabile devi passare al grafico
       $id=$riga['id'];
       $valore=$riga['colonna1'];
       echo "a $id corrisponde il valore $valore<br>";
     }
     
   }
}

//estraggo i valori, se ripetuti comunque uno solo
$query =mysql_query("SELECT DISTINCT colonna1 FROM macchinario ORDER BY colonna1");
//var_dump($conn);//ok
//$query = mysql_query("SELECT colonna1 FROM macchinario");
var_dump($query);
//creo un array per non dover interrogare due volte il db
while($riga=mysql_fetch_assoc($query)){
   $valore_colonna[]=$riga['colonna1'];
}

?>
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<!--usando le select si evitano errori di scrittura
cosa possibile scrivendo in un campo tipo text-->
<select name="minimo">
   <option value="">- seleziona minimo - </option>
<?php
   foreach($valore_colonna as $valore){
     echo "<option value=\"$valore\">$valore</option>";
   }
?>
</select>
<select name="massimo">
   <option value="">- seleziona massimo - </option>
<?php
   foreach($valore_colonna as $valore){
     echo "<option value=\"$valore\">$valore</option>";
   }
?>
</select><br>
<label>
<input name="invia" type="submit" id="invia" value="invia">
</label>
</form>
 
Ultima modifica:
Ciao Borgo Itala. Ho provato il tuo codice e credo che ci siamo quasi.
Mi spiego: quando seleziono il valore minimo e il valore massimo il php mi restituisce solo il valore massimo. Ad esempio se imposto un minimo di 0.23 e un massimo di 0.4 il php mi restituirà 0.4 mentre mi deve restituire tutti i valori della colonna1 compresi tra 0.23 e 0.4 senza escludere nessun valore (quindi 0.23|0.25|0.23|0.30|0.40).
Ho notato però un problema: il tuo codice restituisce il valore massimo soltanto se imposto un valore minimo di 0.23 e un valore massimo di 0.25; se provo a selezionare un qualsiasi altro valore mi genera questo errore:
Codice:
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\xampp\htd...
Ciao.
 
Ciao Borgo Italia. Ho riprovato il tuo codice ma mi genera sempre quel "maledetto" errore. Ho provato anche a fare copia/incolla ma niente, l'errore persiste.
Poi ho cominciato a pensare una cosa: dipenderà forse dalla tabella?
Io l'ho strutturata in questo modo:
id ----> INT (3) AUTO_INCREMENT Chiave primaria
colonna1 -----> float

Cosa ne pensi? Può essere effettivamente così? La tua tabella come l'hai strutturata?
Ciao.
 

Discussioni simili