modifica query selezione

  • Creatore Discussione Creatore Discussione danpippo
  • Data di inizio Data di inizio
ciao
scusate ma secondo me state girando in tondo come trottole

dove è il value del chekbox?

dimenticavo
se ha più chek invece di chiamarli
HTML:
<!-- ...qui manca il value... -->
<input name="c1" type="checkbox"/>elemento 1<br>
<input name="c2" type="checkbox"/>elemento 2<br>                    
<input name="c3" type="checkbox"/>elemento 3<br>
<input name="c4" type="checkbox"/>elemento 4<br>
<!-- ..ecc.. -->
sarebbe meglio chiamarli
HTML:
<!-- ..ecc.. -->
<input name="c[]" type="checkbox" value="elemento 1"/>elemento 1<br>
<input name="c[]" type="checkbox" value="elemento 2"/>elemento 2<br>                    
<input name="c[]" type="checkbox" value="elemento 3"/>elemento 3<br>
<input name="c[]" type="checkbox" value="elemento 4"/>elemento 4<br>
<!-- ..ecc.. -->
poi nella parte php li estrai con un foreach

PHP:
<?php
//............
$q = "SELECT * FROM dati WHERE 1=1 ";
$whe_2="";
foreach($_POST['c'] as $valore){
	if($valore !=""){
		$whe_2.=" OR genere = '$valore' ";
	}
}
$q .= $whe_2." ORDER BY nome";
//e qui il solito var_dump. !!!fai delle prova e posta il/i risultato/i del var_dump
var_dump($q);
//questo indipendentemente da quanto la query ti fa vedere
//....
?>
 
Ultima modifica:
PHP:
array
// senza value
  'c1' => string 'on' (length=2)
// con value
  'c2' => string 'elemento2' (length=9)

string 'SELECT * FROM dati WHERE 1=1 && (1=0 || genere = 'elemento1'  || genere = 'elemento2' ) ORDER BY nome' (length=101)

Cambia poco mettere il value per come è stata impostata la query
 
poi nella parte php li estrai con un foreach
PHP:
<?php
//............
$q = "SELECT * FROM dati WHERE 1=1 ";
$whe_2="";
foreach($_POST['c'] as $valore){
    if($valore !=""){
        $whe_2.=" OR genere = '$valore' ";
    }
}
$q .= $whe_2." ORDER BY nome";
//e qui il solito var_dump. !!!fai delle prova e posta il/i risultato/i del var_dump
var_dump($q);
//questo indipendentemente da quanto la query ti fa vedere
//....
?>

Codice:
SELECT * FROM dati WHERE 1=1 OR genere = 'elemento1'


Cosi però verranno sempre estratti tutti
 
ragazzi tutto ok ora funziona. Avevo fatto degli errori di sintassi. Posto il codice completo casomai dovesse servire anche ad altri:

PHP:
<html>
<head>
<style type="text/css">
body{
margin-left: .5cm;
    margin-right: .5cm;
    color: black;
    font-family: Verdana, Arial, sans-serif;
    font-size: 10pt;
}
</style>
</head>
<?php
$nomeDB = "";
$connessione = mysql_connect("", "", "") or die("Connessione al Server non possibile.");
mysql_select_db($nomeDB, $connessione) or die("Connessione al DB non possibile.");
$q = "SELECT * FROM dati WHERE 1=1";
if (isset($_POST['c1']) || isset($_POST['c2']) || isset($_POST['c3']) || isset($_POST['c4']) || isset($_POST['c5']) || isset($_POST['c6']) || isset($_POST['c7']) || isset($_POST['c8'])) {
    $q.= " && (1=0";
    if (isset($_POST['c1'])) {
        $q.= " || genere = 'elemento1' ";
    }
    if (isset($_POST['c2'])) {
        $q.= " || genere = 'elemento2' ";
    }
    if (isset($_POST['c3'])) {
        $q.= " || genere = 'elemento3' ";
    }
    if (isset($_POST['c4'])) {
        $q.= " || genere = 'elemento4' ";
    }
    if (isset($_POST['c5'])) {
        $q.= " || genere = 'elemento5' ";
    }
    if (isset($_POST['c6'])) {
        $q.= " || genere = 'elemento6' ";
    }
    if (isset($_POST['c7'])) {
        $q.= " || genere = 'elemento7' ";
    }
    if (isset($_POST['c8'])) {
        $q.= " || genere = 'elemento8' ";
    }
    $q.= ")";
}
$q.= " ORDER BY nome";  
$id_ris = mysql_query($q)
        or die("Non è possibile eseguire la query!");
$num_libri = mysql_num_rows($id_ris);
mysql_data_seek($id_ris, 0);
echo "<table border='1'>";
echo "<tr>";
echo "<td>Tipo</td>";
echo "<td>Quantità</td>";
echo "<td>Prezzo</td>";
echo "<td>Genere</td>";
echo "<td>Nome</td>";
echo "</tr>";
for ($i = 0; $i < $num_libri; $i++) {
    $record = mysql_fetch_array($id_ris);
    echo "<tr>";
    echo "<td>", $record[0], "</td>";
    echo "<td>", $record[1], "</td>";
    echo "<td>", $record[2], "</td>";
    echo "<td>", $record[3], "</td>";
    echo "<td>", $record[4], "</td>";
    echo "</tr>";
}
echo "</table>";
?>  
</html>

e qui il form:
HTML:
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="AlterVista - Editor HTML">
<TITLE></TITLE>
<form action="action.php" method="post" target="_blank">
<span style="font-style: italic;">Ricerca per tipo</span><br><br>
<span style="font-weight: bold; font-style: italic;">
Scelta:
<br>
</span>
<font size="3">
<table>
<tr>
<td>
<input name="c1" type="checkbox">elemento1<br>
<input name="c2" type="checkbox">elemento2<br>
<input name="c3" type="checkbox">elemento3<br>
<input name="c4" type="checkbox">elemento4<br>
<input name="c5" type="checkbox">elemento5<br>
<input name="c6" type="checkbox">elemento6<br>
<input name="c7" type="checkbox">elemento7<br>
<input name="c8" type="checkbox">elemento8<br>
</td>
</table>
</font>
<br>
<input value="RICERCA" type="submit">
<input value="ANNULLA" type="reset">
</form>
</HEAD>
<BODY>
<P>&nbsp;</P>
</BODY>
</HTML>

non avete idea dell'aiuto monumentale che mi avete dato! Vi ringrazio di cuore
Comunque non è detto che sia finita qui. E' probabile che presto dovrò richiedervi altri aiuti...:fonzie:
grazie ancora!
 
ciao
@ciric
non capisco bene la tua osservazione: se è ininfluente a che servono i chek e la loro eventuale selezione?
che poi la query non sia come dovrebbe essere è un'altro discorso e quindi deve/o/i costruirla meglio, ma se non dai un value il valore di qualsiasi chek e null (o vuoto).
forse la query andrebbe scritta meglio senza 1=1 AND e togliere l'ultimo OR
ma concatenere una stringa $stringa = 'elemento1' OR genere = 'elemento2' OR.....
togliere l'ultimo OR con substring e, se non vuota, aggiungere il where davanti
PHP:
<?php
$q = "SELECT * FROM dati "; 
$whe_2=""; 
foreach($_POST['c'] as $valore){ 
    if($valore !=""){ 
        $whe_2.=" genere = '$valore' OR"; //l'OR in fondo
    } 
}
if(strlen($whe_2) >0){
	$whe_2=" WHERE ".substr($whe_2,0,(strlen($whe_2)-2));
}
$q .= $whe_2." ORDER BY nome";
/*
quindi se ho checcato es. due chek il 2 e il 4) la query diventa
$q = "SELECT * FROM dati WHERE  genere = 'elemento2' OR genere = 'elemento4' ORDER BY nome";
quindi ti estrae i record in cui genere sia uguale a elemento2 oppure a elemento4
*/
//e qui il solito var_dump. !!!fai delle prova e posta il/i risultato/i del var_dump 
var_dump($q); 
//questo indipendentemente da quanto la query ti fa vedere 
//.... 
?>
 
Felice cmq che il nostro amico abbia risolto
 
ehm...purtroppo non ancora...
ho dovuto modificare la mia query facendo una selezione su piu tabelle identiche

Codice:
$q = "SELECT * FROM tabella1 UNION SELECT * FROM tabella2 UNION SELECT * FROM tabella3 ";

ma facendo le selezioni con le checkbox mi dice "non è possibile eseguire la query"
non è che potreste darmi l'ultimo aiuto?
grazie :)
 
questo è masochismo :cool:

hai qualche campo che accomuna le tabelle?

tipo id

se si ti conviene considerare le JOIN
 
adoro farmi male...:)

le tabelle non hanno campi in comune.
Speravo di poterci riuscire senza usare le join, che le ho provate con il vecchio script e non funzionavano.
 
ma facendo le selezioni con le checkbox mi dice "non è possibile eseguire la query"
non è che potreste darmi l'ultimo aiuto?

metti piu info
PHP:
$id_ris = mysql_query($q)
        or die("Non è possibile eseguire la query!<br/>" . $q . "<br/>" . mysql_error());
 
scrivendo cosi, mi da quando seleziono le checkbox il seguente messaggio

Non è possibile eseguire la query!
select * from tab1 union select * from tab2 union select * from tab3 && (1=0 || genere = 'elemento1' || genere = 'elemento2' )
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 '&& (1=0 || genere = 'elemento1' || genere = 'elemento2' )' at line 1
 
select * from tab1 union select * from tab2 union select * from tab3 :confused: && (1=0 || genere = 'elemento1' || genere = 'elemento2' )


manca il WHERE 1=1

lo hai perso
 
l'ho inserito ma adesso anche selezionando le checkbox, mi visualizza sempre tutti i dati del db.
mentre se cambio la query in questo modo inserendo where 1=1 ad ogni tabella

Codice:
$q="select * from tab1 WHERE 1=1 union select * from tab2 WHERE 1=1 union select * from tab3 WHERE 1=1 ";

mi funziona solo con la tab3...
boh!
 
dovresti cercare di costruire qualcosa del genere

Codice:
 $q="select tab.* from (
                
                select * from tab1 
                union all
                select * from tab2 
                union all
                select * from tab3 
                
                ) tab
                
                WHERE 1=1 && tab.genere = 'elemento1' order by tab.nome";

non l'ho testata ma dovrebbe funzionare
provala prima direttamente su phpmyadmin, quando sei sicuro che i risultati sono quelli che ti aspetti cominci a costruirla con il php
 
ok funziona
però scrivendo

Codice:
WHERE 1=1 && tab.genere = 'elemento1'

io inserisco la query che funziona solo su quel dato elemento, rendendo inutile la selezione delle checkbox. Per intenderci, eseguendo questa query mi fa vedere tutti gli elementi1 delle tabelle. Ma selezionando elemento3, sempre elemento1 mi fa vedere...
come faccio a farlo funzionare tramite checkbox?
ciao
 
&& tab.genere = 'elemento1'

era un esempio di come poteva essere la query, non devi metterlo

PHP:
 $q="select tab.* from (
                
                select * from tab1 
                union all
                select * from tab2 
                union all
                select * from tab3 
                
                ) tab
                
                WHERE 1=1";

e poi vai avanti come facevi prima

ricorda di mettere tab. prima del nome del campo

es:tab.genere
 
Ultima modifica:

Discussioni simili