You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PHP+MySQL多图上传代码?表单嵌入中间怎么做?

Modifica Codice PHP per 6 Upload Immagini e Inserimento nel Form Testuale

Passo 1: Aggiornare la Tabella MySQL

Prima di tutto, assicurati che la tabella soluzioni disponga di colonne per le 6 immagini. Se non esistono, esegui questa query SQL:

ALTER TABLE soluzioni 
ADD COLUMN foto2 VARCHAR(255), 
ADD COLUMN foto3 VARCHAR(255), 
ADD COLUMN foto4 VARCHAR(255), 
ADD COLUMN foto5 VARCHAR(255), 
ADD COLUMN foto6 VARCHAR(255);

Passo 2: Unire il Form di Upload e il Form Testuale

Combina i due form in uno solo (con enctype="multipart/form-data" per gestire i file) e inserisci i campi di upload dove preferisci nel mezzo dei campi testuali. Ecco un esempio con anteprime immagini:

<div>
  <form method="post" enctype="multipart/form-data" target="_self">
    <!-- Campi testuali iniziali -->
    <div>
      <label>Titolo:</label>
      <input type="text" name="titolo" required>
    </div>
    <div>
      <label>Sottotitolo:</label>
      <input type="text" name="sottotitolo" required>
    </div>

    <!-- Sezione upload immagini inserita nel mezzo -->
    <div style="margin: 20px 0;">
      <h3>Carica fino a 6 Immagini</h3>
      <div>
        <input type="file" name="foto[]" accept="image/*" onchange="loadFile(event, 1)">
        <img id="preview1" style="max-width: 100px; max-height: 100px; margin-left: 10px;">
      </div>
      <div>
        <input type="file" name="foto[]" accept="image/*" onchange="loadFile(event, 2)">
        <img id="preview2" style="max-width: 100px; max-height: 100px; margin-left: 10px;">
      </div>
      <div>
        <input type="file" name="foto[]" accept="image/*" onchange="loadFile(event, 3)">
        <img id="preview3" style="max-width: 100px; max-height: 100px; margin-left: 10px;">
      </div>
      <div>
        <input type="file" name="foto[]" accept="image/*" onchange="loadFile(event, 4)">
        <img id="preview4" style="max-width: 100px; max-height: 100px; margin-left: 10px;">
      </div>
      <div>
        <input type="file" name="foto[]" accept="image/*" onchange="loadFile(event, 5)">
        <img id="preview5" style="max-width: 100px; max-height: 100px; margin-left: 10px;">
      </div>
      <div>
        <input type="file" name="foto[]" accept="image/*" onchange="loadFile(event, 6)">
        <img id="preview6" style="max-width: 100px; max-height: 100px; margin-left: 10px;">
      </div>
    </div>

    <!-- Campi testuali finali -->
    <div>
      <label>Testo 1:</label>
      <textarea name="testo1" required rows="5"></textarea>
    </div>
    <div>
      <label>Testo 2:</label>
      <textarea name="testo2" required rows="5"></textarea>
    </div>
    <div>
      <label>Sottocategoria:</label>
      <input type="text" name="sottocategoria" required>
    </div>

    <!-- Pulsante di invio -->
    <div style="margin-top: 20px;">
      <input type="submit" name="aggiungi" value="AGGIUNGI E CARICA IMMAGINI">
    </div>
  </form>
  <?php if(isset($error)) echo '<p style="color: red;">' . $error . '</p>'; ?>
</div>

<script>
// Funzione per l'anteprima delle immagini
function loadFile(event, index) {
    const preview = document.getElementById('preview' + index);
    preview.src = URL.createObjectURL(event.target.files[0]);
    preview.onload = () => URL.revokeObjectURL(preview.src); // Libera memoria
}
</script>

Passo 3: Codice PHP Combinato (Upload + Inserimento nel Database)

Sostituisci il tuo codice di gestione MySQL con questo, che gestisce sia l'upload delle 6 immagini che l'inserimento nel database in modo sicuro:

<?php 
include("../Connections/connect.php"); 

$error = "";

if (isset($_POST['aggiungi'])) {
    // Array per memorizzare i nomi dei file delle immagini
    $foto_nomi = array_fill(0, 6, null);
    $cartella_upload = 'images/';
    $dimensione_target = 1000; // Dimensione massima per larghezza/altezza

    // Gestisci ogni file caricato
    if(isset($_FILES['foto']) && !empty($_FILES['foto']['tmp_name'][0])) {
        foreach($_FILES['foto']['tmp_name'] as $indice => $tmp_nome) {
            // Salta se non è stato caricato un file per questo campo
            if($_FILES['foto']['error'][$indice] !== UPLOAD_ERR_OK) continue;

            $nome_file = basename($_FILES['foto']['name'][$indice]);
            $percorso_file = $cartella_upload . $nome_file;

            // Sposta il file nella cartella di destinazione
            if(move_uploaded_file($tmp_nome, $percorso_file)) {
                // Ottieni l'estensione del file
                $estensione = strtolower(pathinfo($percorso_file, PATHINFO_EXTENSION));
                
                // Ottieni dimensioni originali
                list($larghezza_originale, $altezza_originale) = getimagesize($percorso_file);
                $rapporto = $larghezza_originale / $altezza_originale;

                // Calcola nuove dimensioni mantenendo il rapporto
                $larghezza = $dimensione_target;
                $altezza = $dimensione_target;

                if ($larghezza / $altezza > $rapporto) {
                    $larghezza = $altezza * $rapporto;
                } else {
                    $altezza = $larghezza / $rapporto;
                }

                // Crea immagine ridotta
                $immagine_ridotta = imagecreatetruecolor($larghezza, $altezza);

                switch($estensione) {
                    case 'jpg':
                    case 'jpeg':
                        $immagine_originale = imagecreatefromjpeg($percorso_file);
                        imagecopyresized($immagine_ridotta, $immagine_originale, 0, 0, 0, 0, $larghezza, $altezza, $larghezza_originale, $altezza_originale);
                        imagejpeg($immagine_ridotta, $percorso_file, 75);
                        break;
                    case 'png':
                        $immagine_originale = imagecreatefrompng($percorso_file);
                        imagecopyresized($immagine_ridotta, $immagine_originale, 0, 0, 0, 0, $larghezza, $altezza, $larghezza_originale, $altezza_originale);
                        imagepng($immagine_ridotta, $percorso_file);
                        break;
                }

                // Salva il nome del file nell'array
                $foto_nomi[$indice] = $nome_file;
            } else {
                $error .= "Errore nel caricamento dell'immagine " . ($indice + 1) . "<br>";
            }
        }
    }

    // Se non ci sono errori, inserisci nel database
    if(empty($error)) {
        // Prepared statement per evitare SQL injection
        $query = "INSERT INTO soluzioni 
                  (foto1, foto2, foto3, foto4, foto5, foto6, titolo, sottotitolo, testo1, testo2, sottocategoria) 
                  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        
        $stmt = $connessione->prepare($query);
        
        // Collega i parametri (s = stringa)
        $stmt->bind_param("sssssssssss", 
            $foto_nomi[0], $foto_nomi[1], $foto_nomi[2], 
            $foto_nomi[3], $foto_nomi[4], $foto_nomi[5],
            $_POST['titolo'], $_POST['sottotitolo'], $_POST['testo1'], 
            $_POST['testo2'], $_POST['sottocategoria']
        );

        if($stmt->execute()) {
            header("Location: index.php");
            exit();
        } else {
            $error = "Errore nell'inserimento: " . $stmt->error;
        }

        $stmt->close();
    }
}
?>

Note Importanti per la Sicurezza

  • Validazione File: Il codice controlla l'estensione, ma puoi aggiungere un controllo più stringente sui tipi MIME per evitare caricamenti di file pericolosi.
  • Sanitizzazione Nomi File: Puoi modificare il nome del file per evitare caratteri speciali o path traversal (es. usare uniqid() per generare un nome unico).
  • Permessi Cartella: Assicurati che la cartella images/ abbia i permessi corretti (es. 755) per permettere al server di scrivervi.
  • Prepared Statement: Abbiamo sostituito la query diretta con prepared statement per prevenire SQL injection, un rischio grave nel codice originale.

内容的提问来源于stack exchange,提问作者ahmelg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:26:25