phpBB Italia chiude!
phpBB Italia ringrazia tutti gli utenti che hanno dato fiducia al nostro progetto per ben 9 anni, e che, grazie al grande lavoro fatto da tutto lo Staff (rigorosamente a titolo gratuito), hanno portato il portale a diventare il principale punto di riferimento italiano alla piattaforma phpBB.

Purtroppo, causa motivi personali, non ho più modo di gestirlo e portarlo avanti. Il forum viene ora posto in uno stato di sola lettura, nonché un archivio storico per permettere a chiunque di fruire di tutte le discussioni trattate.

Il nuovo portale di assistenza per l'Italia di phpBB diventa phpBB-Store.it, cui ringrazio per aver deciso di portare avanti questo grande progetto.

Grazie ancora,
Carlo - Amministratore di phpBB Italia

Riempimento Combobox

Area di discussione relativa al linguaggio di programmazione web più conosciuto. Il forum è dedicato anche a MySQL, la piattaforma di database più utilizzata con il PHP.
Rispondi
echiave
Utente
Utente
Messaggi: 4
Iscritto il: 26/10/2015, 14:57
Sesso: Maschio
Server: Windows

Riempimento Combobox

Messaggio da echiave » 26/10/2015, 15:18

Buongiorno. Sono nuovo del forum e ringrazio in anticipo per l'aiuto che potrete darmi. Premetto che da molti anni non programmo e quindi sono un po' arrugginito (vicino ai 70 la memoria fa un po' cilecca).
A suo tempo avevo adottato un semplice javascript che trascrivo qui di seguito per riempire tre combobox sulla base di quanto inserito nel precedente. I dati di riempimento erano elencati uno per uno.

Codice: Seleziona tutto

<script type="text/javascript">
function fillSecondCombo()
{
   var combo1 = document.getElementById('Combobox1');
   var combo2 = document.getElementById('Combobox2');
   var combo3 = document.getElementById('Combobox3');
combo3.options.length = 0
   var selected = combo1.options[combo1.options.selectedIndex].value;
   if (selected == "Free number")
   {
combo2.options.length = 3;
combo2.options[0] = new Option("Choose the country", "0");
combo2.options[1] = new Option("+39 Italy", "+39 Italy");
combo2.options[2] = new Option("+44 United Kingdom", "+441 United Kingdom");
}
   else
   if (selected == "Smart number")
   {
combo2.options.length = 21;
combo2.options[0] = new Option("Choose the country", "0");
combo2.options[1] = new Option("+1 United States", "+1 United States");
combo2.options[2] = new Option("+30 Greece", "+30 Greece");
combo2.options[3] = new Option("+31 Netherlands", "+31 Netherlands");
combo2.options[4] = new Option("+32 Belgium", "+32 Belgium");
combo2.options[5] = new Option("+33 France", "+33 France");
combo2.options[6] = new Option("+34 Spain", "+34 Spain");
combo2.options[7] = new Option("+351 Portugal", "+351 Portugal");
combo2.options[8] = new Option("+353 Ireland", "+353 Ireland");
combo2.options[9] = new Option("+358 Finland", "+358 Finland");
combo2.options[10] = new Option("+36 Hungary", "+36 Hungary");
combo2.options[11] = new Option("+39 Italy", "+39 Italy");
combo2.options[12] = new Option("+41 Switzerland", "+41 Switzerland");
combo2.options[13] = new Option("+420 Czech Republic", "+420 Czech Republic");
combo2.options[14] = new Option("+421 Slovakia", "+421 Slovakia");
combo2.options[15] = new Option("+43 Austria", "+43 Austria");
combo2.options[16] = new Option("+44 United Kingdom", "+442 United Kingdom");
combo2.options[17] = new Option("+45 Denmark", "+45 Denmark");
combo2.options[18] = new Option("+46 Sweden", "+46 Sweden");
combo2.options[19] = new Option("+47 Norway", "+47 Norway");
combo2.options[20] = new Option("+48 Poland", "+48 Poland");
}
   else
   {
      combo2.options.length = 0;
   }
}
</script>
Ora, per un'altra applicazione, dovrei effettuare la medesima operazione ma prendendo i dati di riempimento da un databese Mysql. Ho quindi provato a modificare lo script come segue.

Codice: Seleziona tutto

<script type="text/javascript">
function fillcombobox()
{
   var combo1 = document.getElementById('Combobox1');
   var combo2 = document.getElementById('Combobox2');
   var selected = combo1.options[combo1.options.selectedIndex].value;
   if (selected == "Roma")
   {
	   $mysql_server = '62.149.150.246';
	   $mysql_username = 'Sql908843';
	   $mysql_password = 'fxjz7q8veo';
	   $mysql_database = 'Sql908843_1';
	   $mysql_table = 'Delegati';
	   $db = mysql_connect($mysql_server, $mysql_username, $mysql_password);
	   if (!$db)
	   {
	   die('Non connesso con il server del database!<br>'.mysql_error());
	   }
	   mysql_select_db($mysql_database, $db) or die('Non connesso con il database<br>'.mysql_error());

	   $sql = "SELECT cognome, nome FROM ".$mysql_table." WHERE delita > 0 ;
	   $result = mysql_query($sql, $db);
	   $numrows = mysql_num_rows($result);

	   // se il database è vuoto lo stampo a video
	   if ($numrows == 0){
	     echo "Delegati non disponibili!";
	   }
	   // se invece trovo delle occorrenze...
	   else
	   {
	   combo2.options.length = $numrows + 1;
	   combo2.options[0] = new Option("Scegli chi delegare", "0");

	   for ($x = 0; $x < $numrows; $x++){
		    
		    // recupero il contenuto di ogni record rovato
		    $resrow = mysql_fetch_row($result);
		    $cognome = $resrow[0];
		    $nome = $resrow[1];

		combo2.options[$x+1] = new Option($cognome .” “ . $nome, $cognome .” “ . $nome);
		mysql_close($myconn);
		}
   else
   if (selected == "Estero")
   {
	   $mysql_server = '62.149.150.246';
	   $mysql_username = 'Sql908843';
	   $mysql_password = 'fxjz7q8veo';
	   $mysql_database = 'Sql908843_1';
	   $mysql_table = 'Delegati';
	   $db = mysql_connect($mysql_server, $mysql_username, $mysql_password);
	   if (!$db)
	   {
	   die('Non connesso con il server del database!<br>'.mysql_error());
	   }
	   mysql_select_db($mysql_database, $db) or die('Non connesso con il database<br>'.mysql_error());

	   $sql = "SELECT cognome, nome FROM ".$mysql_table." WHERE delest > 0 ;
	   $result = mysql_query($sql, $db);
	   $numrows = mysql_num_rows($result);
	   // se il database è vuoto lo stampo a video
	   if ($numrows == 0){
	     echo "Delegati non disponibili!";
	   }
	   // se invece trovo delle occorrenze...
	   else
	   {
	   combo2.options.length = $numrows + 1;
	   combo2.options[0] = new Option("Scegli chi delegare", "0");

	   for ($x = 0; $x < $numrows; $x++){
		    
		    // recupero il contenuto di ogni record rovato
		    $resrow = mysql_fetch_row($result);
		    $cognome = $resrow[0];
		    $nome = $resrow[1];

		combo2.options[$x+1] = new Option($cognome .” “ . $nome, $cognome .” “ . $nome);
		mysql_close($myconn);
		}
}
   else
   {
      combo2.options.length = 0;
   }
}
</script>
Edit by Sir Xiradorn: Editato con il bbcode Code

Purtroppo il riempimento non funziona e non mi ritorna alcun errore. Cosa sbaglio ?
Grazie
Emilio

Avatar utente
Sir Xiradorn
Grafico
Grafico
Messaggi: 1659
Iscritto il: 11/08/2009, 12:41
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.6.15
Database: MariaDB 10.1.9
Località: Lontano....
Contatta:

Re: Riempimento Combobox

Messaggio da Sir Xiradorn » 27/10/2015, 2:41

Andiamo per gradi. Hai controllato se le query restituiscono valori che ti servono? Anche con un semplice echo o un var_dump.

Se si allora il problema sta nel javascript.

E' l'unico modo che hai per escludere il problema. Prova prima lato server (php). Se la funge, andiamo a lavorare sulla parte client (js)
Sir Xiradorn
Immagine
~ XDojo - Xiradorn Lab Division - xiradorn.it ~
~ GitHub - XiradornLab ~

Immagine
Stargate - phpbb 3.0.x || 3.1.x || 3.2.x

echiave
Utente
Utente
Messaggi: 4
Iscritto il: 26/10/2015, 14:57
Sesso: Maschio
Server: Windows

Re: Riempimento Combobox

Messaggio da echiave » 01/11/2015, 15:25

Grazie per la risposta.
Ho seguito il tuo consiglio e ho creato due codici ed entrambi funzionano.
Il primo lato server riempie correttamente un combobox con dati prelevati da un database MySQL. Ecco lo script

Codice: Seleziona tutto

<?php
 $host = '62.149.150.246';
 $user = 'Sql908843';
 $password = 'fxjz7q8veo';
 $database = 'Sql908843_1';
 $db = mysqli_connect($host, $user, $password)
 or die ("Impossibile connettersi al server $host");
 mysqli_select_db($db, $database)
 or die ("Impossibile connettersi al database $dtabase");
 $query = "SELECT ID,cognome,nome FROM Delegati WHERE delita=0 ORDER BY cognome";
 $resultSet = mysqli_query($db, $query);
 echo "<select name=dele size=1 id=Combobox1 style=position:absolute;left:279px;top:312px;width:249px;height:26px;z-index:0;>";
 while ($row = mysqli_fetch_array($resultSet)) {
 print "<option value=$row[ID]>";
 print "$row[cognome] $row[nome]</option>";
 }
 echo "</select>";
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Untitled Page</title>
<meta name="generator" content="WYSIWYG Web Builder 10 - http://www.wysiwygwebbuilder.com">
<link href="circolo.css" rel="stylesheet" type="text/css">
<link href="combo2.css" rel="stylesheet" type="text/css">
</head>
<body>
</body>
</html>
L'ltro codice consta di due combobox il secondo dei quali si riempie in base al contenuto del primo.
I valori di riempimento del secondo combobox sono stringhe fisse mentre io vorrei che i dati fossero prelevati, come nel primo esempio, da un database MySQL tramite query che dipendono dal valore del primo combobox.

Codice: Seleziona tutto

<!doctype html>
<html>
<head>
<meta charset="iso-8859-1">
<title>Untitled Page</title>
<meta name="generator" content="WYSIWYG Web Builder 10 - http://www.wysiwygwebbuilder.com">
<link href="circolo.css" rel="stylesheet">
<link href="combo1.css" rel="stylesheet">
<script>
function fillSecondCombo()
{
   var combo1 = document.getElementById('Combobox1');
   var combo2 = document.getElementById('Combobox2');
   var selected = combo1.options[combo1.options.selectedIndex].value;
   if (selected == "Italia")
   {
combo2.options.length = 2;
combo2.options[0] = new Option("Scegli la citta", "0");
combo2.options[1] = new Option("Milano", "Milano");
combo2.options[2] = new Option("Roma", "Roma");
}
   else
   if (selected == "Estero")
   {
combo2.options.length = 2;
combo2.options[0] = new Option("Scegli la citta", "0");
combo2.options[1] = new Option("Londra", "Londra");
combo2.options[2] = new Option("Parigi", "Parigi");
}
   else
   {
      combo2.options.length = 0;
   }
}
</script>

</head>
<body>
<select name="Combobox1" size="1" id="Combobox1" onchange="fillSecondCombo();return false;" style="position:absolute;left:116px;top:166px;width:222px;height:27px;z-index:0;">
<option value="0">Scegli</option>
<option value="Italia">Italia</option>
<option value="Estero">Estero</option>
</select>
<select name="Combobox2" size="1" id="Combobox2" style="position:absolute;left:116px;top:222px;width:222px;height:27px;z-index:1;">
</select>

</body>
</html>
I due codici da soli funzionano ma non riesco a capire come combinarli.
Ho provato di tutto ma senza successo.
Grazie per ogni possibile aiuto

Avatar utente
Sir Xiradorn
Grafico
Grafico
Messaggi: 1659
Iscritto il: 11/08/2009, 12:41
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.6.15
Database: MariaDB 10.1.9
Località: Lontano....
Contatta:

Re: Riempimento Combobox

Messaggio da Sir Xiradorn » 01/11/2015, 17:02

Allora vediamo una prima cosa. Impara a non usare il set mysql perchè sarà deprecato. Ho riscritto la stessa funzione con il NUOVO set di funzioni. Leggermente più complesso e un codice pulito e ordinato così comprendi quali sono i cambiamenti fatti.

Codice: Seleziona tutto

<?php
/**
 * Riscrittura tramite PDO
 * @author: Sir Xiradorn <http://xiradorn.it>
 */

$host = '62.149.150.246';
$username = 'Sql908843';
$password = 'fxjz7q8veo'; // a me è vuota ma tu metti quello che serve
$dbname = 'Sql908843_1';

$dbtype = "mysql";

/// Inizializzazione, controllo e connessione al DB
try {
    if (!in_array($dbtype, PDO::getAvailableDrivers())) {
        throw new PDOException ("I settaggi sono sbagliati o i driver non avviabili. Connessione è solo per db mysql");
    }    
} catch (PDOException $e) {
    echo "Errore: " . $e->getMessage();
}

try {
    $db = new PDO("$dbtype:host=$host;dbname=$dbname;charset=utf8", $username, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $e) {
    echo "Errore: " . $e->getMessage();
}

// Inizializzazione della query - no injection
// va creato uno statement che poi viene parsato
$query     = "SELECT ID, nome, cognome 
            FROM xir_user 
            WHERE delita = :delita 
            ORDER BY user";

$stmt = $db->prepare($query);
$stmt->bindValue(":delita", 0, PDO::PARAM_INT);
$stmt->execute();
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Untitled Page</title>
    <meta name="generator" content="WYSIWYG Web Builder 10 - http://www.wysiwygwebbuilder.com">
    <link href="circolo.css" rel="stylesheet" type="text/css">
    <link href="combo2.css" rel="stylesheet" type="text/css">
</head>
<body>

<?php
echo '<select name="dele" id="Combobox1">';

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    print "<option value=$row[ID]>";
    print "$row[cognome] $row[nome]</option>";
}

echo '</select>';

?>

</body>
</html>
Prova se funge e poi riscriviamo il secondo
Sir Xiradorn
Immagine
~ XDojo - Xiradorn Lab Division - xiradorn.it ~
~ GitHub - XiradornLab ~

Immagine
Stargate - phpbb 3.0.x || 3.1.x || 3.2.x

echiave
Utente
Utente
Messaggi: 4
Iscritto il: 26/10/2015, 14:57
Sesso: Maschio
Server: Windows

Re: Riempimento Combobox

Messaggio da echiave » 01/11/2015, 23:58

GRAZIE ! Funge egregiamente.
Purtroppo sono un po' rimasto indietro con i linguaggi di programmazione.
Ora ti spiego la logica dei miei due combobox.
Il primo dei due deve contenere solo due campi: Italia o estero quindi lo posso direttamente inserire senza problemi.
Il secondo combobox (quello che mi hai aiutato a creare) deve essere riempito tramite due differenti query che dipendono dalla prima scelta.
Se la scelta e' Italia, la query deve filtrare delita=0
Se la scelta e' estero la query deve filtrare delest<3
Spero di essere stato abbastanza chiaro.
Fammi sapere se ti occorrono alter informazioni
Emilio

echiave
Utente
Utente
Messaggi: 4
Iscritto il: 26/10/2015, 14:57
Sesso: Maschio
Server: Windows

Re: Riempimento Combobox

Messaggio da echiave » 02/11/2015, 0:03

Dimenticavo di dirti che la scelta dell'utente dovra' avere come conseguenza la modifica de record scelto con l'incremento rispettivamente delle variabili delita o delest di una unita' oltre alla scrittura di un nuovo record in un'altra tabella dello stesso database.
Purtroppo non conoscendo il set PDO mi vedo costretto a chiedere il tuo aiuto con un esempio.
Grazie

Avatar utente
Sir Xiradorn
Grafico
Grafico
Messaggi: 1659
Iscritto il: 11/08/2009, 12:41
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 5.6.15
Database: MariaDB 10.1.9
Località: Lontano....
Contatta:

Re: Riempimento Combobox

Messaggio da Sir Xiradorn » 03/11/2015, 22:01

Vediamo mi vengono in mente due soluzioni:
- Visto che i valori sono pochi da prelevare, potresti prelevarli tutti a monte con una query a abilitare il tutto tramite un js a comparsa/scomparsa che attiva/disattiva i combo

Esempio: prelevi tutti i valori con alcune query
- sistemi tutti i valori prelevati in tutti i combo generati da php
- sul primario attacchi l'evento sul primo combo con qualcosa del tipo combo.onchange=qualcosa combo.addEventListener('change'm qualcosa) (o con jquery combo.on('change', qualcosa) ) che attiva il combo desiderato e così via

Più semplice e veloce da un certo qual punto di vista ma con un dispendio maggiore di memoria. Per pochi dati conta poco

- Potresti fare una commistione di JS + php + metodi ad esempio potresti anche usare un GET visto che non stai passando dati sensibilissimi. Fai una cosa del genere
-- Fase 1: visto che non hai la variabile che ti serve alla comparsa dei combo legati al primo, fai una prima form dove gestisci le prime variabili. Al submit passi una cerca variabile che indica quale sub combo far apparire e così via.

Esempio : url (fittizio) http://example.com/form.php
Combo 1 - Get - $_GET['primario'] (non esiste)
select: pizza | pasta | pane

-> scelgo pizza e lo invio con il GET nella variabile primario

Fase 2: url risultante http://example.com/form.php?primario=pizza
Primario == pizza quindi attivo questo secondo box che passo come 'secondario'
margherita | capricciosa | diavola

-> Scelgo capricciosa

Fase 3: url risultante http://example.com/form.php?primario=pi ... apricciosa

ecc....

Qui di volta in volta fai la query che vuoi nello specifico caso. Risparmi memoria ma complichi il tutto.
Sir Xiradorn
Immagine
~ XDojo - Xiradorn Lab Division - xiradorn.it ~
~ GitHub - XiradornLab ~

Immagine
Stargate - phpbb 3.0.x || 3.1.x || 3.2.x

Rispondi

Torna a “PHP - MySQL”

Chi c’è in linea

Visitano il forum: Nessuno e 98 ospiti