query e form con select multipla

FMax

Nuovo Utente
21 Lug 2020
11
0
1
Buongiorno ,

avrei questo quesito da porre in PHP-MYSQL(PDO) :

come è possibile leggere i record restituiti da una query di SELECT mettendoli in un form html con una select multipla …. e poi stampare a video solo i record selezionati dalla select multipla ?

grazie

FMax
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Se è una select multipla per html non dimenticare ad aggiungere multiple (in xhtml è un altro) dopo il nome della select il valore di option sarà cosa l'agente utente ti invierà dal tuo form e altresi imposta almeno un selected (prelesezionato per la massima compatibilità dei vecchi e nuovi browser).
Quindi la sintassi con metodo POST sarebbe $_POST['name_select'][0]['value_option'], $_P0ST['name_select'][1]['value_option']
Invece la SELECT SQL la metti nel ciclo while e stampi tanti option :)
https://www.php.net/manual/en/language.variables.external.php se aggiungi [] al name php creerà un array.
 
Ultima modifica:

FMax

Nuovo Utente
21 Lug 2020
11
0
1
ok grazie Hormus ... ho tolto i [] e funziona meglio ....
Se ora voglio mettere in riga i valori anzichè in colonna come me li passa adesso nella select ?
Ti passo una stralcio di codice :

<form method="POST" action="">
<label> Redattore </label>
<select name="userlist" multiple="multiple">
<option>-- seleziona redattore --</option>
<?php foreach ($results as $output) {?>
<option><?php echo $output["codRic"] ; ?> </option>
<option><?php echo $output["Difficolta"] ; ?> </option>
<option><?php echo $output["Calorie"] ; ?> </option>
<option><?php echo $output["Porzioni"] ; ?> </option>
<option><?php echo $output["Note"] ; ?> </option>
<option><?php echo $output["Tipologia"] ; ?> </option>
<option><?php echo $output["Tempocott"] ; ?> </option>
<option><?php echo $output["Preparazione"] ; ?> </option>
<option><?php echo $output["Ingredienti"] ; ?> </option>
<option><?php echo $output["Qta"] ; ?> </option>
<?php }?>

</select>
<input type="submit" name="btnsubmit" value="Submit">
</form>
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Scusa devi aggiungere [] altrimenti avrai solo l'ultimo invio e ovviamente il valore in option, per La Stampa di $_POST usa var_dump.
PHP:
<!DOCTYPE html>
<html>
<head>
<title>multi select</title>
</head>
<body>
<form method="POST" action="">
<label> Redattore </label>
<select name="userlist[]" multiple>
<option value="0" selected>-- seleziona redattore --</option>
<option value="1">1</option>
<option value="2">2</option>
</select>
<input type="submit" name="btnsubmit" value="Submit">
</form>
</body>
</html>
<?php
var_dump($_POST);
 
Ultima modifica:

MarcoGrazia

Utente Attivo
15 Dic 2009
785
16
18
58
Udine
www.stilisticamente.com
PHP:
<form method="POST" action="">
<label> Redattore </label>
<select name="userlist[]" multiple="multiple">
<option>-- seleziona redattore --</option>
<?php
foreach ($results as $output) {
  $option =<<<EOF
  <option value="0">{$output["codRic"]}> </option>
  <option value="1">{$output["Difficolta"]}</option>
  <option value="2">{$output["Calorie"]} </option>
  <option value="3">{$output["Porzioni"]} </option>
  <option value="4">{$output["Note"]} </option>
  <option value="5">{$output["Tipologia"]} </option>
  <option value="6">{$output["Tempocott"]} </option>
  <option value="7">{$output["Preparazione"]} </option>
  <option value="8">{$output["Ingredienti"]} </option>
  <option value="9">{$output["Qta"]} </option>
EOF;
}
echo $option;
?>

</select>
<input type="submit" name="btnsubmit" value="Submit">
</form>
Così è meno "spaghetti code", ma quello che non comprendo è il perché di quel ciclo foreach.
Dici che li tiri fuori da una query, e va bene, ma almeno che tu non abbia effettuato un fetchAll() non ha senso un ciclo, a meno che tu non voglia avere una lista di <option> lunga quanto l'intero database, in quel caso... va un po' modificata la sequenza.
 

FMax

Nuovo Utente
21 Lug 2020
11
0
1
<?php
if (isset($_POST[ 'btnsubmit']))
{
$getredatt=$_POST['userlist'] ;

try {
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT ric_Ricette.codRic,Difficolta,Calorie,Porzioni,Note,Tipologia,Tempocott,Preparazione,Ingredienti,Qta,CRedattValid FROM ric_Ricette,ric_Ingredienti WHERE (CRedattValid='$getredatt')";
$stmt = $db->prepare($sql);
$stmt->execute();
$results=$stmt->fetchAll();
// $db->exec($sql);

} catch(PDOException $e) {
echo $sql . "<br>" . $e->getMessage();
}
}
?>

questo è il codice precedente con la fetchAll . Vado a fare una query su db in funzione della variabile $getredatt che è il POST di una </select> precedente .....
Mi piacerebbe che me li mettesse in riga tutti i record anzichè in colonna , nella </select> e che potessi selezionare una o piu righe .... poi un pulsante submit che mi permetta di stampare a video le "ricette" ,che sono i valori degli attributi in riga, solo quelli selezionati....anche piu di uno
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.274
328
83
@FMax

Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
PHP (2).png
quando posti del codice php, oppure la funzione codice dalla barra degli strument
box inserisci.png

Inoltre IMPORTANTE: Prima di creare una nuova discussione o di rispondere alle discussioni esistenti ricordati di leggere attentamente il Regolamento del Forum e l'eventuale regolamento specifico della sezione!

Grazie

Correggi i tuoi post
mi raccomando altrimenti sarò costretto a cancellare le discussioni
 

FMax

Nuovo Utente
21 Lug 2020
11
0
1
Codice:
<?php
if (isset($_POST[ 'btnsubmit']))
{
$getredatt=$_POST['userlist'] ;

try {
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT ric_Ricette.codRic,Difficolta,Calorie,Porzioni,Note,Tipologia,Tempocott,Preparazione,Ingredienti,Qta,CRedattValid FROM ric_Ricette,ric_Ingredienti WHERE (CRedattValid='$getredatt')";
$stmt = $db->prepare($sql);
$stmt->execute();
$results=$stmt->fetchAll();
// $db->exec($sql);

} catch(PDOException $e) {
echo $sql . "<br>" . $e->getMessage();
}
}
?>
spero sia corretto in questa maniera .... sorry ma sono nuovo e non mi era ben chiaro questo passaggio
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.274
328
83
Con codice php devi selezionare il tipo di codice PHP e così per altri tipi di codice!
Tu invece hai lasciato il tipo codice che è un codice generico! esempio:
PHP:
echo="Questo è un codice PHP";
 

FMax

Nuovo Utente
21 Lug 2020
11
0
1
PHP:
<?php
if (isset($_POST[ 'btnsubmit']))
{
$getredatt=$_POST['userlist'] ;

try {
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT ric_Ricette.codRic,Difficolta,Calorie,Porzioni,Note,Tipologia,Tempocott,Preparazione,Ingredienti,Qta,CRedattValid FROM ric_Ricette,ric_Ingredienti WHERE (CRedattValid='$getredatt')";
$stmt = $db->prepare($sql);
$stmt->execute();
$results=$stmt->fetchAll();
// $db->exec($sql);

} catch(PDOException $e) {
echo $sql . "<br>" . $e->getMessage();
}
}
?>
 

MarcoGrazia

Utente Attivo
15 Dic 2009
785
16
18
58
Udine
www.stilisticamente.com
Mo ce meni, o peggio .... :D
PHP:
<?php
if (isset($_POST[ 'btnsubmit']))
{
  $getredatt=$_POST['userlist'] ;

  try {
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "SELECT ric_Ricette.codRic,Difficolta,Calorie,Porzioni,Note,Tipologia,Tempocott,Preparazione,Ingredienti,Qta,CRedattValid FROM   ric_Ricette ,ric_Ingredienti WHERE (CRedattValid = :get ); --";
    $stmt = $db->prepare($sql);
    $stmt = $db->bindValue( ':get', $getredatt );
    $stmt->execute();
    $results=$stmt->fetchAll();
// $db->exec($sql);

  } catch( PDOException $e ) {
    var_dump( $stmt );
    $stmt->debugDumpParams();
    do {
      printf( "%s\n %s:%d %s (%d) [%s]\n", $sql, $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class( $e ) );
      exit;
    } while( $e = $e->getPrevious() );
  }
}
?>
A parte l'indentazione del codice, che dovresti sempre usare, anche nel tuo editor, così da rendere leggibile il codice, a parte questo, dovresti SEMPRE evitare di passare direttamente una variabile in una query, a meno che questa non derivi da una calcolo effettuato nel codice.
Il bindValue() serve a effettuare l'escape della frase da inserire, e ti permette anche di gestire il tipo.
Io non sapendo se $getredatt è di tipo stringa o intero ho evitato di metterlo, la sua forma corretta poteva essere:
PHP:
 $stmt = $db->bindValue( ':get', $getredatt, PDO::PARAM_STR );
dove PDO::pARAM_STR intende passare una stringa, ipotizzando che lo sia.
Altre forme sono PDO::pARAM_INT per gli interi, in questo caso se non sei sicuro che la stringa passata contenga sempre un intero, il consiglio è di fare il casting:
PHP:
$stmt = $db->bindValue( ':get', (int)$getredatt, PDO::PARAM_INT );
Attento ai doppi due punti :: ( In ebraico :D Paamayim Nekudotayim ) sono fondamentali.
Altra cosa, ho finito la query con un commento " ; -- " perché così non si possono inserire fraudolentemente altre query in aggiunta.
E' un sistema un po' blando ma funzionante per evitare alcune form di injection; magari qui non ha senso ma è per buona pratica.
Infine ti ho aggiunto pure del codice nella catch, è quello che uso io, da qualche funzionalità in più per scovare gli errori.
 

FMax

Nuovo Utente
21 Lug 2020
11
0
1
grazie MarcoGrazia, dalle tue istruzioni capisco che ne sai un sacco ...
mi consiglieresti qualche link per apprendere in maniera avanzata il php - mysql ?
trovo sempre siti che ti spiegano i soliti argomenti ...
 

MarcoGrazia

Utente Attivo
15 Dic 2009
785
16
18
58
Udine
www.stilisticamente.com
Ti consiglio dei siti... cartacei :D cioè dei libri, poi farti un giro di amici, anche virtuali su gruppi di facebook, anche se li ho abbandonati da un po' perché erano diventati dei gruppi "pubblicitari" poi se riesci come me a trovare lavoro in questo mondo, be non sono affatto rose e fiori, anzi troverai un sacco di str... cioè di persone che ti mangeranno in testa e tu dovrai imparare a difenderti.
Comunque io, non so un bel nulla, infatti sono qui come te a far domande :)
 

FMax

Nuovo Utente
21 Lug 2020
11
0
1
ahhhhh.... beh innanzitutto ci lavori ... poi senz'altro ne sai più di me .... io ho imparato on the fly .... senza libri rubando un pò quà e un pò la sintassi e qualche stralcio di codice ....
che libro mi consiglieresti ?
 

MarcoGrazia

Utente Attivo
15 Dic 2009
785
16
18
58
Udine
www.stilisticamente.com
ahhhhh.... beh innanzitutto ci lavori ... poi senz'altro ne sai più di me .... io ho imparato on the fly .... senza libri rubando un pò quà e un pò la sintassi e qualche stralcio di codice ....
che libro mi consiglieresti ?
A rubare il codice non ci se capisce nulla, te lo dico per esperienza personale, e lo stai scoprendo anche tu.
Quanto al saperne di più non direi o non sarei qui a fare domande banali :D
Per i libri che dire, ce ne sono tanti su PHP e MySQL ne scegli uno, io posso consigliarti quelli della O'Really che in genere sono ben tradotti, prendine uno aggiornato, controlla cioè la data di edizione o ti può capitarne uno che ti parla della versione 5 del linguaggio.
Se non vuoi pagare uno sproposito, puoi andare alla iblioteca comunale, li saranno datati ma almeno è gratis e comunque le basi sono quelle, quindi...

quindi col libro in mano, e un server funzionante giochi a fare il principiante, provando gli esempi, cercando di capire come funzionano e perché proprio in quel modo, non c'è altra strada all'inizio.
Perché il libro rspetto al Web? Perché è quello e solo quello, non distrae con mille link che portano su siti che poi portano su siti, che poi...
 

FMax

Nuovo Utente
21 Lug 2020
11
0
1
A rubare il codice non ci se capisce nulla, te lo dico per esperienza personale, e lo stai scoprendo anche tu.
Quanto al saperne di più non direi o non sarei qui a fare domande banali :D
Per i libri che dire, ce ne sono tanti su PHP e MySQL ne scegli uno, io posso consigliarti quelli della O'Really che in genere sono ben tradotti, prendine uno aggiornato, controlla cioè la data di edizione o ti può capitarne uno che ti parla della versione 5 del linguaggio.
Se non vuoi pagare uno sproposito, puoi andare alla iblioteca comunale, li saranno datati ma almeno è gratis e comunque le basi sono quelle, quindi...

quindi col libro in mano, e un server funzionante giochi a fare il principiante, provando gli esempi, cercando di capire come funzionano e perché proprio in quel modo, non c'è altra strada all'inizio.
Perché il libro rspetto al Web? Perché è quello e solo quello, non distrae con mille link che portano su siti che poi portano su siti, che poi...
grazie seguirò il tuo consiglio... buona programmazione