Visualizzazione risultati 1 fino 11 di 11

Discussione: Mysqli errore di connessione

  1. #1
    paolin non è connesso Utente
    Data registrazione
    13-02-2014
    Messaggi
    138

    Predefinito Mysqli errore di connessione

    Salve, ho un problema dovuto al passaggio a PHP 7.3 premetto che sono piuttosto ignorante in materia
    Ho una pagina php da dove si può scaricare un file, dove vengono visualizzate le volte che si è scaricato, usava ancora mysql... ho cercato sul forum e in rete per trovare una soluzione, poi ho utilizzato lo script DebugErrorPHP e mi dice
    Warning: mysqli_select_db() expects parameter 1 to be mysqli, string given in /membri/paolin/db/visualizzanumdownload26.php on line 18
    Errore nella connessione:


    Ecco il codice modificato con mysqli
    Codice PHP:
    // identificativo numerico della pagina word (prime 2 cifre sono l'anno)
    $pagina = 261;
    $db_host = 'localhost';
    $db_user = 'xxxxxx';
    $db_name = 'my_xxxxxx';

    // 1. Connessione corretta con gestione password
    $db = mysqli_connect($db_host, $db_user, $db_name);

    if (!
    $db) {
    die(
    'Errore nella connessione: ' . mysqli_connect_error());

    }

    $db = mysqli_select_db($db_user, $db_name);
    if (!
    $db) {
    die(
    'Errore nella connessione: ');

    }



    // 2. Query protetta da SQL Injection
    $query = "SELECT visite FROM contatore WHERE pagina = " . mysqli_real_escape_string($db, $pagina);
    $res = mysqli_query($db, $query);

    if (
    $res) {
    $visite = mysqli_fetch_assoc($res);
    // 3. Output corretto con apici per le chiavi dell'array
    echo 'È stato scaricato ' . $visite['visite'] . ' volte';
    } else {
    echo
    "Errore nella query: " . mysqli_error($db);
    }

    mysqli_close($db);
    La linea 18 sarebbe questa:
    Codice PHP:
    $db = mysqli_select_db($db_user, $db_name);
    Qualcuno gentilmente mi può aiutare?
    Grazie mille

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    23,494

    Predefinito

    $db_user è una stringa che rappresenta il nome dell'utente, nel tuo caso "paolin".
    Invece, in il primo argomento di mysqli_select_db() è il riferimento dal database, non il nome dell'utente.

    Comunque, ti consiglio di utilizzare una IA così da capire molto più facilmente gli errori e la motivazione dei problemi.


    Ciao!
    Ultima modifica di alemoppo : Ieri alle ore 12.45.09

  3. #3
    paolin non è connesso Utente
    Data registrazione
    13-02-2014
    Messaggi
    138

    Predefinito

    Grazie per rispondermi Alemoppo.

    In realtà già avevo ottenuto questo codice con l'AI. Il nome utente si, è paolin... (qui nel post ho messo le "x")

    Ho cercato su google mysqli_select_db() ma non capisco come devo sostituire per aprire il database "contatore". Sono ignorante
    perdo ore senza trovare una soluzione... aiutami per favore. Grazie

  4. #4
    paolin non è connesso Utente
    Data registrazione
    13-02-2014
    Messaggi
    138

    Predefinito

    ho provato così
    Codice PHP:
    $db = mysqli_select_db($db, "contatore");
    if (!
    $db) {
    die(
    'Errore nella connessione: ');

    }
    ma mi restituisce Errore nella connessione:

  5. #5
    paolin non è connesso Utente
    Data registrazione
    13-02-2014
    Messaggi
    138

    Predefinito

    I file originali (con mysql) erano due, nella cartella db:
    visualizzanumdownload25.php e ha questo codice (che funzionava prima)
    Codice PHP:
    <?php
    // identificativo numerico della pagina word (prime 2 cifre sono l'anno)
    $pagina = 251;

    $db_host = "localhost";
    $db_user = "paolin";
    $db_name = "my_paolin";

    $db = mysql_connect($db_host, $db_user);
    if (
    $db == FALSE)
    die (
    "Errore nella connessione.");

    $res = mysql_select_db($db_name);
    if (
    $res == FALSE)
    die (
    "Errore nella selezione del DB.");




    // visualizzo il numero di visite
    $res = mysql_query("SELECT visite FROM contatore WHERE pagina = $pagina");
    $visite = mysql_fetch_assoc($res);
    echo
    "&Egrave; stato scaricato ".$visite['visite']." volte";
    ?>
    e il file download25.php con codice
    Codice PHP:
    <?php


    // identificativo numerico della pagina word 2025
    $pagina = 251;

    $db_host = "localhost";
    $db_user = "paolin";
    $db_name = "my_paolin";

    $db = mysql_connect($db_host, $db_user);
    if (
    $db == FALSE)
    die (
    "Errore nella connessione.");

    $res = mysql_select_db($db_name);
    if (
    $res == FALSE)
    die (
    "Errore nella selezione del DB.");




    // numero di visite attuali
    $res = mysql_query("UPDATE contatore SET visite = visite + 1 WHERE pagina = $pagina");
    if (!
    mysql_num_rows($res)){
    // pagina non presente nel database
    // aggiungo la pagina nella tabella
    mysql_query("INSERT INTO contatore (pagina, visite) VALUES ($pagina, 1)");
    }

    // visualizzo il numero di visite
    $res = mysql_query("SELECT visite FROM contatore WHERE pagina = $pagina");
    $visite = mysql_fetch_assoc($res);



    $_GET['file'] = trim(htmlentities($_GET['file'], ENT_QUOTES));

    //$path = './files/' . $_GET['file'];
    $path = $_GET['file'];

    $size = filesize($path);

    if (!
    $size)
    {
    die();
    }

    $check = substr($_GET['file'], - 3);

    if(
    $check != "rar" AND $check != "zip")
    {
    die (
    'Stai tentando di scaricare un file non scaricabile');
    }
    else
    {
    @
    header("Content-Type: application/octet-stream");
    @
    header('Content-Disposition: attachment; filename=' . $_GET['file'] . ';');
    @
    header("Content-Length: " . $size);

    readfile($path);
    }
    echo
    "La pagina e stata visitata ".$visite['visite']." volte";

    ?>
    Poi nel file lunaioscarica25.php (fuori cartella db) veniva richiamato questo codice
    Codice PHP:
    <?php include 'db/visualizzanumdownload25.php'; ?>
    Come risolvo?
    Grazie mille per l'aiuto

  6. #6
    GraphOGLRisorse non è connesso AlterGuru 2500
    Data registrazione
    14-02-2015
    Messaggi
    4,555

    Predefinito

    Salve,
    non è complicato fare il passaggio.

    Ad ogni modo, se vuole imparare un po' di mysqli, si tenga una cipia da parte dei vecchi file rinominandoli ad esempio visualizzanumdownload25_old.php e download25_old.php. Così potra raffrontare il codice vecchio con quello aggiornato.

    Questo è il codice aggiornato:

    visualizzanumdownload25.php

    Codice PHP:
    <?php

    // identificativo numerico della pagina word (prime 2 cifre sono l'anno)
    $pagina = 251;

    $db_host = "localhost";
    $db_user = "paolin";
    $db_pass = "";
    $db_name = "my_paolin";

    $db = mysqli_connect($db_host, $db_user, $db_pass, $db_name );
    if (
    $db == FALSE) {
    die (
    "Errore nella connessione.");
    }

    $res = mysqli_select_db($db, $db_name);
    if (
    $res == FALSE) {
    die (
    "Errore nella selezione del DB.");
    }

    // visualizzo il numero di visite
    $res = mysqli_query($db, "SELECT visite FROM contatore WHERE pagina = $pagina");
    $visite = mysqli_fetch_assoc($res);
    echo
    "&Egrave; stato scaricato ".$visite['visite']." volte";

    ?>
    download25.php

    Codice PHP:
    <?php

    // identificativo numerico della pagina word 2025
    $pagina = 251;

    $db_host = "localhost";
    $db_user = "paolin";
    $db_pass = "";
    $db_name = "my_paolin";

    $db = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
    if (
    $db->connect_errno) {
    die(
    "Errore nella connessione: " . $db->connect_error);
    }

    // aggiornare il contatore delle visite
    $res = mysqli_query($db, "UPDATE contatore SET visite = visite + 1 WHERE pagina = $pagina");
    $rows = mysqli_affected_rows($res);
    if (
    rows === 0) {
    // pagina non presente nel database
    // aggiungo la pagina nella tabella
    mysqli_query($db, "INSERT INTO contatore (pagina, visite) VALUES ($pagina, 1)");
    }

    // recuperare il numero di visite
    $res_visite = mysqli_query($db, "SELECT visite FROM contatore WHERE pagina = $pagina");
    $visite = mysqli_fetch_assoc($res_visite);

    // Sanitizzare il parametro 'file'
    if (isset($_GET['file'])) {
    $_GET['file'] = trim(htmlentities($_GET['file'], ENT_QUOTES));
    } else {
    die(
    "Parametro 'file' mancante.");
    }

    $path = './files/' . $_GET['file'];

    // verificare se il file esiste
    if (!file_exists($path)) {
    die(
    "File non trovato.");
    }

    $size = filesize($path);
    if (
    $size === false || $size == 0) {
    die(
    "File vuoto o errore nel calcolo delle dimensioni.");
    }

    // verificare estensione file
    $check = strtolower(substr($_GET['file'], -3));
    if (
    $check != "rar" && $check != "zip") {
    die(
    'Stai tentando di scaricare un file non scaricabile');
    }

    // inviare gli header e il file
    header("Content-Type: application/octet-stream");
    header('Content-Disposition: attachment; filename=' . basename($_GET['file']));
    header("Content-Length: " . $size);

    readfile($path);

    // visualizzare il numero di visite
    echo "La pagina è stata visitata " . $visite['visite'] . " volte";

    ?>
    Cordiali saluti.
    Ultima modifica di GraphOGLRisorse : Oggi alle ore 14.41.53

  7. #7
    paolin non è connesso Utente
    Data registrazione
    13-02-2014
    Messaggi
    138

    Predefinito

    Grazie mille per la risposta!

    Funziona ma non completamente. Mi spiego: visualizzo correttamente il numero di volte scaricato, ma se clicco su "scarica" invece di scaricarmi il file.zip mi dice
    La pagina non funziona
    paolin.altervista.org al momento non è in grado di gestire la richiesta.
    HTTP ERROR 500


    Nel file lunaioscarica25.php c'è questo link
    <a href="https://paolin.altervista.org/db/download25.php?file=lunaio25.zip">

    Qui il collegamento https://paolin.altervista.org/lunaioscarica25.php

  8. #8
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    23,494

    Predefinito

    Io ci vedo errori di sintassi ed errori vari: ad esempio vedo che viene usato il costruttore "new mysqli()" in modalità ad oggetti, ma poi tutto il resto del codice è "procedurale". O si usa la versione ad oggetti o la procedurale.
    Inoltre ci sono altri problemi, tipo:
    Codice PHP:
    $rows = mysqli_num_rows($res)
    Manca il punto e virgola.

    Poi mysqli_num_rows() ha senso usarla su SELECT. Su una UPDATE, va usato mysqli_affected_rows().

    mysqli_select_db() è inutile usarlo perché il db è già passato tramite il costruttore.

    In realtà già avevo ottenuto questo codice con l'AI
    Prova ad esempio su ChatGPT attuale (versione Free), sono abbastanza sicuro che questi problemi che ti ho detto te li può risolvere, senza contare che probabilmente ce ne sono altri.

    Ciao!
    Ultima modifica di alemoppo : Oggi alle ore 01.34.31

  9. #9
    paolin non è connesso Utente
    Data registrazione
    13-02-2014
    Messaggi
    138

    Predefinito

    alemoppo grazie per la tua dettagliata risposta.

    Già mettendo il ";" funzionerebbe...
    ho provato su ChatGPT attuale (versione Free) inserendo il codice ed ecco il risultato:
    Codice PHP:

    $db
    = new mysqli($db_host, $db_user, "", $db_name);
    if (
    $db->connect_error) {
    die(
    "Errore nella connessione.");
    }

    // sanitize pagina
    $pagina = isset($pagina) ? $pagina : 'default';

    // UPDATE counter
    $stmt = $db->prepare("UPDATE contatore SET visite = visite + 1 WHERE pagina = ?");
    $stmt->bind_param("s", $pagina);
    $stmt->execute();

    if (
    $stmt->affected_rows === 0) {
    $stmt = $db->prepare("INSERT INTO contatore (pagina, visite) VALUES (?, 1)");
    $stmt->bind_param("s", $pagina);
    $stmt->execute();
    }

    // get visits
    $stmt = $db->prepare("SELECT visite FROM contatore WHERE pagina = ?");
    $stmt->bind_param("s", $pagina);
    $stmt->execute();
    $result = $stmt->get_result();
    $visite = $result->fetch_assoc();

    // file handling
    $file = basename($_GET['file']); // prevents directory traversal
    $path = './files/' . $file;

    if (!
    file_exists($path)) {
    die(
    "File non trovato");
    }

    // check extension safely
    $allowed = ['zip', 'rar'];
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));

    if (!
    in_array($ext, $allowed)) {
    die(
    "Stai tentando di scaricare un file non scaricabile");
    }

    // download
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$file\"");
    header("Content-Length: " . filesize($path));

    readfile($path);

    echo
    "La pagina è stata visitata " . $visite['visite'] . " volte";
    ?>
    Così funziona, cioè scarica il file.zip e mostra le volte in cui è stato scaricato, MA NON INCREMENTA il numero; forse devo aggiornare anche il file visualizzanumdowload25.php

    allora ho chiesto come collegare i due file, risposta
    Così com’è, i due file non sono realmente collegati: uno aggiorna/gestisce download, l’altro fa solo una SELECT. Devi farli lavorare sulla stessa logica e sugli stessi parametri.

    In più, nel secondo file hai ancora un piccolo problema: stai costruendo la query direttamente dentro la stringa SQL (anche se usi intval, non è il massimo).

    ✔️ Collegamento corretto (semplice e funzionante)
    �� 1. Primo file (download + contatore)

    Assicurati che $pagina venga passato, ad esempio via URL:

    download.php?file=test.zip&pagina=1

    Nel primo file aggiungi:

    $pagina = isset($_GET['pagina']) ? intval($_GET['pagina']) : 0;

    Così entrambi i file lavorano con lo stesso ID.

    �� 2. Migliora il secondo file

    Riscrivilo così:

    Codice PHP:
    <?php
    $db
    = new mysqli($db_host, $db_user, "", $db_name);
    if (
    $db->connect_error) {
    die(
    "Errore nella connessione.");
    }

    // prendi pagina da GET
    $pagina_id = isset($_GET['pagina']) ? intval($_GET['pagina']) : 0;

    // prepared statement (più sicuro)
    $stmt = $db->prepare("SELECT visite FROM contatore WHERE pagina = ?");
    $stmt->bind_param("i", $pagina_id);
    $stmt->execute();
    $result = $stmt->get_result();

    if (
    $result && $result->num_rows > 0) {
    $row = $result->fetch_assoc();
    echo
    "&Egrave; stato scaricato " . $row['visite'] . " volte";
    } else {
    echo
    "Nessun dato trovato per questa pagina.";
    }
    ?>
    Così riscritto mi visualizza "Nessun dato trovato per questa pagina."

    Poi prosegue...
    ⚠️ Problema logico importante

    Nel tuo primo script:

    aumenti visite ogni volta che la pagina viene chiamata
    non solo quando il download è completato

    �� Quindi il contatore non misura download reali, ma richieste.

    Se vuoi contare solo download veri, l’incremento deve stare subito prima di readfile().

    �� Miglioramento consigliato

    Se vuoi qualcosa di più pulito:

    un solo file gestisce tutto (download + conteggio + output JSON)
    oppure API separata


    Sarebbe bello, ma già così per me è arabo
    Ultima modifica di paolin : Oggi alle ore 12.39.25

  10. #10
    paolin non è connesso Utente
    Data registrazione
    13-02-2014
    Messaggi
    138

    Predefinito

    Citazione Originalmente inviato da paolin Visualizza messaggio
    ✔️ Collegamento corretto (semplice e funzionante)
    🔧 1. Primo file (download + contatore)

    Assicurati che $pagina venga passato, ad esempio via URL:

    download.php?file=test.zip&pagina=1

    Nel primo file aggiungi:

    $pagina = isset($_GET['pagina']) ? intval($_GET['pagina']) : 0;

    Così entrambi i file lavorano con lo stesso ID.
    In che punto dovrei aggiungere questo codice? (scusa la mia ignoranza)
    grazie

  11. #11
    paolin non è connesso Utente
    Data registrazione
    13-02-2014
    Messaggi
    138

    Predefinito

    Gli ho chiesto (a chatGpt)
    ok, unisci i due file in un unico script pulito e pronto all'uso

    Ecco una versione unica, pulita e pronta all’uso che:

    aggiorna il contatore solo quando il file è valido e sta per essere scaricato
    permette anche di vedere le visite senza scaricare (?pagina=1)
    evita problemi comuni (SQL injection, path traversal, header già inviati)


    ✅ Script unico (newdownload25.php)
    Codice PHP:
    <?php
    $db
    = new mysqli($db_host, $db_user, "", $db_name);
    if (
    $db->connect_error) {
    die(
    "Errore nella connessione.");
    }

    // parametro pagina
    $pagina = isset($_GET['pagina']) ? intval($_GET['pagina']) : 0;

    // funzione per ottenere visite
    function getVisite($db, $pagina) {
    $stmt = $db->prepare("SELECT visite FROM contatore WHERE pagina = ?");
    $stmt->bind_param("i", $pagina);
    $stmt->execute();
    $result = $stmt->get_result();

    if (
    $result && $result->num_rows > 0) {
    return
    $result->fetch_assoc()['visite'];
    }
    return
    0;
    }

    // funzione per incrementare visite
    function incrementaVisite($db, $pagina) {
    $stmt = $db->prepare("UPDATE contatore SET visite = visite + 1 WHERE pagina = ?");
    $stmt->bind_param("i", $pagina);
    $stmt->execute();

    if (
    $stmt->affected_rows === 0) {
    $stmt = $db->prepare("INSERT INTO contatore (pagina, visite) VALUES (?, 1)");
    $stmt->bind_param("i", $pagina);
    $stmt->execute();
    }
    }

    // 👉 SE viene richiesto un file → download
    if (isset($_GET['file'])) {

    $file = basename($_GET['file']); // sicurezza
    $path = './files/' . $file;

    // controlli file
    if (!file_exists($path)) {
    die(
    "File non trovato");
    }

    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
    if (!
    in_array($ext, ['zip', 'rar'])) {
    die(
    "Tipo file non consentito");
    }

    // incrementa contatore SOLO qui (download reale)
    if ($pagina > 0) {
    incrementaVisite($db, $pagina);
    }

    // headers download
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$file\"");
    header("Content-Length: " . filesize($path));

    readfile($path);
    exit;
    }

    // 👉 SE NON c'è file → mostra visite
    if ($pagina > 0) {
    $visite = getVisite($db, $pagina);
    echo
    "&Egrave; stato scaricato " . $visite . " volte";
    } else {
    echo
    "Parametro pagina mancante.";
    }
    ?>
    🔗 Come usarlo

    Download file + conteggio

    <a href="newdownload25.php?file=lunaio25.zip&pagina=1 ">Scarica file</a>

    Visualizzare numero download

    <a href="newdownload25.php?pagina=1">Visualizza download</a>


    Però se clicco su "scarica" mi dice "File non trovato"
    https://paolin.altervista.org/lunaioscarica25.php

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •