gestione menu a tendina con cartella

  • Creatore Discussione Creatore Discussione luigi777
  • Data di inizio Data di inizio
allora, ho quasi fatto da solo .. però quando apro la pagina la select si popola con i nomi delle cartelle? invece non deve fare cosi.
ecco il codice:
PHP:
<tr>
      <td>Seleziona Categoria</td>
      <td><?php echo "<select onchange=\"document.location.href = '" . $_SERVER['PHP_SELF'] . "?cat=' + this.value;\" name=\"cat\">";?>

        <option  selected="selected" value="">Seleziona</option>
        <?php
	$result = $db->query("SELECT * FROM foto_categorie");
	
	while($row = mysqli_fetch_array($result))
	{
	$_cat= $row['titolo'];
	$id = $row['id'];
  ?>
        <option value="<?php echo $id; ?>|<?php echo $_cat; ?>" ><?php echo $_cat; ?></option>
        <?php
  }
?>
      </select></td>
    </tr>
<tr><tr>
      <td>Seleziona Foto</td>
      <td><?php
// open the current directory
$pieces = explode("|", addslashes($_GET["cat"]));
$dhandle = opendir('../public/photo/'.$pieces[1].'');
// define an array to hold the files
$files = array();

if ($dhandle) {
   // loop through all of the files
   while (false !== ($fname = readdir($dhandle))) {
      // if the file is not this file, and does not start with a '.' or '..',
      // then store it for later display
      if (($fname != '.') && ($fname != '..') &&
          ($fname != basename($_SERVER['PHP_SELF']))) {
          // store the filename
          $files[] = (is_dir( "./$fname" )) ? "(Dir) {$fname}" : $fname;
      }
   }
   // close the directory
   closedir($dhandle);
}

echo "<select name=\"file\">\n";
// Now loop through the files, echoing out a new select option for each one
foreach( $files as $fname )
{
   echo "<option>{$fname}</option>\n";
}
echo "</select>\n";
?></td>
    </tr>

e poi mi dite come posso togliere il notice ad questa riga:
$pieces = explode("|", addslashes($_GET["cat"]));
$dhandle = opendir('../public/photo/'.$pieces[1].'');

che essendo non initializzato all'inizio mi salta fuori un notice.

mi date una mano?

grazie mille.
 
Modifica questa porzione di codice:
PHP:
// open the current directory 
$pieces = explode("|", addslashes($_GET["cat"])); 
$dhandle = opendir('../public/photo/'.$pieces[1].''); 
// define an array to hold the files 
$files = array(); 

if ($dhandle) { 
   // loop through all of the files 
   while (false !== ($fname = readdir($dhandle))) { 
      // if the file is not this file, and does not start with a '.' or '..', 
      // then store it for later display 
      if (($fname != '.') && ($fname != '..') && 
          ($fname != basename($_SERVER['PHP_SELF']))) { 
          // store the filename 
          $files[] = (is_dir( "./$fname" )) ? "(Dir) {$fname}" : $fname; 
      } 
   } 
   // close the directory 
   closedir($dhandle); 
}
Così:
PHP:
if (isset($_GET['cat'])) {
    $files = array();
    $pieces = explode('|', addslashes($_GET['cat']));

    $dir = "../public/photo/{$pieces[1]}";

    if (is_dir($dir) && is_readable($dir)) {
        $files = glob("{$dir}/*");

        foreach ($files as $fname) {
            if ($fname == '.' || $fname == '..' || $fname == basename($_SERVER['PHP_SELF'])) {
                continue;
            }

            $files[] = is_dir($fname) ? "(Dir) {$fname}" : $fname;
        }
    }
}
 
ok, va quasi bene solo che vorrei solo il nome del file e non tutto il percorso..

poi un'altra cosa che mi si ripetono i file.
ecco il codice con la tua modifica.
PHP:
<tr>
      <td>Seleziona Foto</td>
      <td><?php
if (isset($_GET['cat'])) {
    $files = array();
    $pieces = explode('|', addslashes($_GET['cat']));

    $dir = "../public/photo/{$pieces[1]}";

    if (is_dir($dir) && is_readable($dir)) {
        $files = glob("{$dir}/*");

        foreach ($files as $fname) {
            if ($fname == '.' || $fname == '..' || $fname == basename($_SERVER['PHP_SELF'])) {
                continue;
            }

            $files[] = is_dir($fname) ? "(Dir) {$fname}" : $fname;
        }
    }
}  

echo "<select name=\"_url\">\n";
// Now loop through the files, echoing out a new select option for each one
foreach( $files as $fname )
{
   echo "<option>{$fname}</option>\n";
}
echo "</select>\n";
?></td>
    </tr>
 
Modifica questa linea:
PHP:
$files[] = is_dir($fname) ? "(Dir) {$fname}" : $fname;
Così:
PHP:
$files[basename($fname)] = is_dir($fname) ? "(Dir) {$fname}" : $fname;
Questa:
PHP:
foreach ($files as $fname) {
Così:
PHP:
foreach ($files as $display_name => $fname) {
E questa:
PHP:
echo "<option>{$fname}</option>\n";
Così:
PHP:
echo "<option value=\"{$display_name}\">{$fname}</option>\n";
Per quanto riguarda il problema della ripetizione dei file, mi sembra strano... In che senso si ripetono?
 
ok, ho fatto cosi:
PHP:
<tr>
      <td>Seleziona Foto</td>
      <td><?php
if (isset($_GET['cat'])) {
    $files = array();
    $pieces = explode('|', addslashes($_GET['cat']));

    $dir = "../public/photo/{$pieces[1]}";

    if (is_dir($dir) && is_readable($dir)) {
        $files = glob("{$dir}/*");

        foreach ($files as $fname) {
            if ($fname == '.' || $fname == '..' || $fname == basename($_SERVER['PHP_SELF'])) {
                continue;
            }

           $files[basename($fname)] = is_dir($fname) ? "(Dir) {$fname}" : $fname;  
        }
    }
}  

echo "<select name=\"_url\">\n";
// Now loop through the files, echoing out a new select option for each one
foreach ($files as $display_name => $fname)  
{
  echo "<option value=\"{$display_name}\">{$fname}</option>\n";  
}
echo "</select>\n";
?></td>
    </tr>

ma è come prima e non so se ho fatto le modifiche giuste..

ti allego un'immagine per farti vedere quello che fa:
http://i51.tinypic.com/106k65l.jpg

Mi dici come mai?

grazie mille.
 
ha ecco perché

ho visto l'html e cosi:
PHP:
<option value="0">../public/photo/Pirografia/19102009305.jpg</option>
<option value="1">../public/photo/Pirografia/19102009306.jpg</option>
<option value="2">../public/photo/Pirografia/19102009307.jpg</option>
<option value="19102009305.jpg">../public/photo/Pirografia/19102009305.jpg</option>
<option value="19102009306.jpg">../public/photo/Pirografia/19102009306.jpg</option>
<option value="19102009307.jpg">../public/photo/Pirografia/19102009307.jpg</option>

come mai?

grazie mille.
 
Scusami, ho invertito i valori. Scrivi:
PHP:
echo "<option value=\"{$fname}\">{$display_name}</option>";
Dev'essere l'Alzheimer che avanza. :D

ok, cosi funziona..

ma solo che non so dove escono 1 2 3 4 5 etc.. poi i nomi delle foto vere..

ad esempio ci sono 14 foto prima ci stanno i numeri da 1 a 14 e poi ci stanno i nominativi delle foto...

e non so nemmeno io dove escono i numeri... hai qualche idea?

Hai visto l'immagine che ti ho allegato?

grazie mille.
buona giornata.
 
scusa, ma c'è un altro problema .. solo che lo stampa nell'html invece a video:


<td><select name="_url">
<br />
<b>Notice</b>: Undefined variable: files in <b>D:\xampp\htdocs\mc2\admin\ph_aggiungi.php</b> on line <b>140</b><br />
<br />
<b>Warning</b>: Invalid argument supplied for foreach() in <b>D:\xampp\htdocs\mc2\admin\ph_aggiungi.php</b> on line <b>140</b><br />
</select>

come si risolve?

grazie.
 
Così come, scusa? Mi sono perso qualcosa? :D

mi genera l'html cosi: e nel menu a tendina fa visualizzare prima i numeri e dopo i nomi veri propri delle foto.

PHP:
<option value="0">../public/photo/Pirografia/19102009305.jpg</option>
<option value="1">../public/photo/Pirografia/19102009306.jpg</option>
<option value="2">../public/photo/Pirografia/19102009307.jpg</option>
<option value="19102009305.jpg">../public/photo/Pirografia/19102009305.jpg</option>
<option value="19102009306.jpg">../public/photo/Pirografia/19102009306.jpg</option>
<option value="19102009307.jpg">../public/photo/Pirografia/19102009307.jpg</option>


e questo che dicevo.
per caso è l'array?
 
Modifica lo script in questo modo:
PHP:
<tr>
    <td>Seleziona Foto</td>
    
    <td>
        <?php
        if (isset($_GET['cat'])) {
            $images = array();
            $pieces = explode('|', addslashes($_GET['cat']));

            $dir = "../public/photo/{$pieces[1]}";

            if (is_dir($dir) && is_readable($dir)) {
                $files = glob("{$dir}/*");

                foreach ($files as $fname) {
                    if (
                        $fname == '.' ||
                        $fname == '..' ||
                        $fname == basename($_SERVER['PHP_SELF'])
                    ) {
                        continue;
                    }

                    if (is_dir($fname)) {
                        $images[basename($fname)] = "(Dir) {$fname}";
                    }
                    else {
                        $images[basename($fname)] = $fname;
                    }
                }
            }
        }

        echo "<select name=\"_url\">\n";
        
        foreach ($images as $display_name => $fname) {
            echo "<option value=\"{$display_name}\">{$fname}</option>\n";
        }
        
        echo "</select>\n";
        ?>
    </td>
</tr>
Così dovrebbe funzionare.
 
ok funziona solo che quando non c'è nulla risalgono di nuovo i notice

<tr>
<td>Seleziona Foto</td>


<td>
<select name="_url">
<br />
<b>Notice</b>: Undefined variable: images in <b>D:\xampp\htdocs\mc2\admin\ph_aggiungi.php</b> on line <b>151</b><br />
<br />
<b>Warning</b>: Invalid argument supplied for foreach() in <b>D:\xampp\htdocs\mc2\admin\ph_aggiungi.php</b> on line <b>151</b><br />

</select>
</td>
</tr>

ti ringrazio molto per l'aiuto che mi stai dando..

grazie buona serata a domani mattina.

ciao.
 

Discussioni simili