RISOLTO problema con script php

Stato
Discussione chiusa ad ulteriori risposte.

Xenex134

Nuovo Utente
36
3
Salve ragazzi sono alle prime armi e sto "giocando" un pò col php ...
Sto riscontrando dei problemi con questo script per la gestione di un db di una fantomatica agenzia di viaggi .

Sostanzialmente quello che vorrei fare è: verificare che i campi del form siano stati tutti compilati, se si allora verifico il numero di pacchetti viaggio disponibili per quel paese... se ce ne sono allora la richiesta di prenotazione è stata completata con successo e ridurrò di 1 i pacchetti disponibili per quel paese, se non ce ne sono apparirà un popup che avviserà l'indisponibilità per quel paese.

Il problema è che quando compilo il form mettendo come destinazione un paese X, anche se ci sono pacchetti disponibili per quel paese X, compare il popup che mi avverte dell'indisponibilità per quel paese.

Potreste aiutarmi a capire dove sbaglio ?
grazie in anticipo
PHP:
<?php

$msg1 = 'Non hai riempito tutti i campi !' ;
$msg2 = 'Richiesta di prenotazione effettuata con successo' ;
$msg3 = 'Non ci sono pacchetti disponibili per questa destinazione ';



   $connection = mysqli_connect('localhost','root','','book_db');




 if(isset($_POST['send'])){
      $name = $_POST['name'];
      $email = $_POST['email'];
      $phone = $_POST['phone'];
      $address = $_POST['address'];
      $location = $_POST['location'];
      $guests = $_POST['guests'];
      $arrivals = $_POST['arrivals'];
      $leaving = $_POST['leaving'];
 

      $request1 = "SELECT n_package FROM destination WHERE country= '$location' ";
      $res =  mysqli_query($connection, $request1);

      if(empty($name) || empty($email) || empty($phone) || empty($address) || empty($location) || empty($guests) || empty($arrivals) || empty($leaving))
          {     
            echo '<script>
            alert("'.$msg1.'");
             </script>';


                   }

        else if($res>0) {
              //scala di 1
         $request2 = "UPDATE destination SET n_package=n_package-1 WHERE country= '$location' ";
         mysqli_query($connection, $request2);
            
           echo '<script>
            alert("'.$msg2.'");
             </script>';
                       }
          
         else if($res<1){
            echo '<script>
            alert("'.$msg3.'");
            </script>';

                      }

                     }
else {


echo 'qualcosa è andato storto riprova di nuovo !';
   }



?>
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Salve ragazzi sono alle prime armi e sto "giocando" un pò col php ...
Sto riscontrando dei problemi con questo script per la gestione di un db di una fantomatica agenzia di viaggi .

Sostanzialmente quello che vorrei fare è: verificare che i campi del form siano stati tutti compilati, se si allora verifico il numero di pacchetti viaggio disponibili per quel paese... se ce ne sono allora la richiesta di prenotazione è stata completata con successo e ridurrò di 1 i pacchetti disponibili per quel paese, se non ce ne sono apparirà un popup che avviserà l'indisponibilità per quel paese.

Il problema è che quando compilo il form mettendo come destinazione un paese X, anche se ci sono pacchetti disponibili per quel paese X, compare il popup che mi avverte dell'indisponibilità per quel paese.

Potreste aiutarmi a capire dove sbaglio ?
grazie in anticipo
PHP:
<?php

$msg1 = 'Non hai riempito tutti i campi !' ;
$msg2 = 'Richiesta di prenotazione effettuata con successo' ;
$msg3 = 'Non ci sono pacchetti disponibili per questa destinazione ';



   $connection = mysqli_connect('localhost','root','','book_db');




 if(isset($_POST['send'])){
      $name = $_POST['name'];
      $email = $_POST['email'];
      $phone = $_POST['phone'];
      $address = $_POST['address'];
      $location = $_POST['location'];
      $guests = $_POST['guests'];
      $arrivals = $_POST['arrivals'];
      $leaving = $_POST['leaving'];
 

      $request1 = "SELECT n_package FROM destination WHERE country= '$location' ";
      $res =  mysqli_query($connection, $request1);

      if(empty($name) || empty($email) || empty($phone) || empty($address) || empty($location) || empty($guests) || empty($arrivals) || empty($leaving))
          {  
            echo '<script>
            alert("'.$msg1.'");
             </script>';


                   }

        else if($res>0) {
              //scala di 1
         $request2 = "UPDATE destination SET n_package=n_package-1 WHERE country= '$location' ";
         mysqli_query($connection, $request2);
         
           echo '<script>
            alert("'.$msg2.'");
             </script>';
                       }
       
         else if($res<1){
            echo '<script>
            alert("'.$msg3.'");
            </script>';

                      }

                     }
else {


echo 'qualcosa è andato storto riprova di nuovo !';
   }



?>
Ciao, dopo aver fatto la mysqli_query, devi fare un fetch sul risultato per ottenere i campi.
Fatta la fetch, mi aspetto che farai $row[0]>0 ecc

Un consiglio.
Per le query, usa il prepare statment di php che elude la SQL Injection https://www.php.net/manual/en/mysqli.prepare.php (io comunque farei lo stesso un check sulla stringhe passate al PHP per evitare che ci siano caratteri strani)
Il check dei campi vuoti, fallo lato front-end anche.
Poi in PHP farei solo delle semplici API REST che ritornano un determinato tipoo di valore a seconda della loro funzione.
In questo caso potresti ritornare true o false a seconda se c'è un pacchetto o meno.
Il risultato lo gestisci tramite front-end.
 

Xenex134

Nuovo Utente
36
3
grazie per l'aiuto , ho visto l'uso della fetch_assoc() ed ho provato a farlo in questo modo ma evidentemente sbaglio qualcosa ... puoi farmi vedere come dovrei usarla in questo caso per favore?

PHP:
<?php

$msg1 = 'Non hai riempito tutti i campi !' ;
$msg2 = 'Richiesta di prenotazione effettuata con successo' ;
$msg3 = 'Non ci sono pacchetti disponibili per questa destinazione ';



   $connection = mysqli_connect('localhost','root','','book_db');




 if(isset($_POST['send'])){
      $name = $_POST['name'];
      $email = $_POST['email'];
      $phone = $_POST['phone'];
      $address = $_POST['address'];
      $location = $_POST['location'];
      $guests = $_POST['guests'];
      $arrivals = $_POST['arrivals'];
      $leaving = $_POST['leaving'];
 

      $request1 = "SELECT n_package FROM destination WHERE country= '$location' ";
      $res =  mysqli_query($connection, $request1);
      
      $row = mysqli_fetch_assoc($res);
    

      if(empty($name) || empty($email) || empty($phone) || empty($address) || empty($location) || empty($guests) || empty($arrivals) || empty($leaving))
          {     
            echo '<script>
            alert("'.$msg1.'");
             </script>';


                   }

        else if($row[0]>0) {
              //scala di 1
         $request2 = "UPDATE destination SET n_package=n_package-1 WHERE country= '$location' ";
         mysqli_query($connection, $request2);
            
           echo '<script>
            alert("'.$msg2.'");
             </script>';
                       }
          
         else if($res<1){
            echo '<script>
            alert("'.$msg3.'");
            </script>';

                      }

                     }
else {


echo 'qualcosa è andato storto riprova di nuovo !';
   }



?>
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
mysqli_fetch_assoc($res)
Dalla doc del php
/* fetch associative array */
while ($row = $result->fetch_assoc()) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

Se usi fetch assoc, poi devi fare $row["n_package"]
 

Xenex134

Nuovo Utente
36
3
Dalla doc del php
/* fetch associative array */
while ($row = $result->fetch_assoc()) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

Se usi fetch assoc, poi devi fare $row["n_package"]
ho provato così ma non va...


PHP:
<?php

$msg1 = 'Non hai riempito tutti i campi !' ;
$msg2 = 'Richiesta di prenotazione effettuata con successo' ;
$msg3 = 'Non ci sono pacchetti disponibili per questa destinazione ';



   $connection = mysqli_connect('localhost','root','','book_db');

  



 if(isset($_POST['send'])){
      $name = $_POST['name'];
      $email = $_POST['email'];
      $phone = $_POST['phone'];
      $address = $_POST['address'];
      $location = $_POST['location'];
      $guests = $_POST['guests'];
      $arrivals = $_POST['arrivals'];
      $leaving = $_POST['leaving'];
 

      $request1 = "SELECT n_package FROM destination WHERE country= '$location' ";
      $res =  mysqli_query($connection, $request1);
      
      while ($row = $res->fetch_assoc()) {
         //printf("%d \n", $row["n_package"]);
         }



      if(empty($name) || empty($email) || empty($phone) || empty($address) || empty($location) || empty($guests) || empty($arrivals) || empty($leaving))
          {     
            echo '<script>
            alert("'.$msg1.'");
             </script>';


                   }

        else if($row["n_package"]>0) {
              //scala di 1
         $request2 = "UPDATE destination SET n_package=n_package-1 WHERE country= '$location' ";
         mysqli_query($connection, $request2);
            
           echo '<script>
            alert("'.$msg2.'");
             </script>';
                       }
          
         else if($row["n_package"]<1){
            echo '<script>
            alert("'.$msg3.'");
            </script>';

                      }

                     }
else {


echo 'qualcosa è andato storto riprova di nuovo !';
   }



?>
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Si ma stai sbagliando però, hai guardato la documentazione su fetch_assoc?

Tu stai facendo un ciclo sui record risultanti dalla query; quindi se non metti le istruzioni nel ciclo è ovvio che non vedrai nulla. Hai lasciato il ciclo senza istruzioni:

PHP:
while ($row = $res->fetch_assoc()) {
         //printf("%d \n", $row["n_package"]);
}

Poi aggiungo che il codice che hai scritto ti funziona in PHP, ma in un linguaggio diverso (Java, C#, C, C++, Go... e non cito nemmeno Rust) avresti errori prima ancora di eseguirlo. $row esiste solo nel ciclo while, è quello il suo scope. Quindi fuori da quel ciclo non esiste nemmeno quella variabile.

Se guardi i log del server, probabilmente avrai dei warning o dei notice (se non le hai disabilitate). ?
 

Xenex134

Nuovo Utente
36
3
Si ma stai sbagliando però, hai guardato la documentazione su fetch_assoc?

Tu stai facendo un ciclo sui record risultanti dalla query; quindi se non metti le istruzioni nel ciclo è ovvio che non vedrai nulla. Hai lasciato il ciclo senza istruzioni:

PHP:
while ($row = $res->fetch_assoc()) {
         //printf("%d \n", $row["n_package"]);
}

Poi aggiungo che il codice che hai scritto ti funziona in PHP, ma in un linguaggio diverso (Java, C#, C, C++, Go... e non cito nemmeno Rust) avresti errori prima ancora di eseguirlo. $row esiste solo nel ciclo while, è quello il suo scope. Quindi fuori da quel ciclo non esiste nemmeno quella variabile.

Se guardi i log del server, probabilmente avrai dei warning o dei notice (se non le hai disabilitate). ?
si l'ho letta la docum. ma non capisco ... cosa devo mettere dentro il while ? sulla documentazione c'è l'esempio che ci mette il printf e basta ..
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
si l'ho letta la docum. ma non capisco ... cosa devo mettere dentro il while ? sulla documentazione c'è l'esempio che ci mette il printf e basta ..

Hai studiato i cicli iterativi, i costrutti condizionali etc? O stai procedendo senza la teoria?
 
  • Mi piace
Reazioni: Ibernato

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
si l'ho letta la docum. ma non capisco ... cosa devo mettere dentro il while ? sulla documentazione c'è l'esempio che ci mette il printf e basta ..
Aggiungo anche che o usi lo stile procedurale o quello Object-oriented.
Hai fatto un copia e incolla senza secondo me capire come funziona.
Se sei alle prime armi con il PHP e non conosci come funziona un linguaggio ad oggetti, usa lo stile procedurale. Poi quando divneti più esperto, usa quello object oriented.
 
  • Mi piace
Reazioni: Mursey

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
si li ho studiati ma non ho capito bene questo fetch_assoc ... davvero ... non capisco come faccio a salvere la risposta della query .... potresti farmi gentilmente vedere come fare ?

Ti faccio queste domande per vedere se hai capito, altrimenti darti il codice da copia e incollare non ti servirà a niente.
Il tuo è un problema con altro, non con fetch_assoc secondo me.

Che cosa fa questo codice?

PHP:
while ($row = $res->fetch_assoc()) {
         //printf("%d \n", $row["n_package"]);
}

Che risultato produce, così come l'hai scritto?
 

Xenex134

Nuovo Utente
36
3
Ti faccio queste domande per vedere se hai capito, altrimenti darti il codice da copia e incollare non ti servirà a niente.
Il tuo è un problema con altro, non con fetch_assoc secondo me.

Che cosa fa questo codice?

PHP:
while ($row = $res->fetch_assoc()) {
         //printf("%d \n", $row["n_package"]);
}

Che risultato produce, così come l'hai scritto?
crea un array associativo cioè $row , con e con $row["n_package"] stampo il campo salvato nell'array ...giusto ?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
crea un array associativo cioè $row , con e con $row["n_package"] stampo il campo salvato nell'array ...giusto ?

Si, esatto.
Quindi... sulla base di questo, vediamo un pò. Tu hai questa query:

PHP:
      $request1 = "SELECT n_package FROM destination WHERE country= '$location' ";

quante corrispondenze puoi avere? Immagino che possono esserci più "country" uguali, oppure no? Se sai già di avere solo 1 corrispondenza perchè non puoi averne di più, allora il while non ti serve nemmeno e una cosa di questo tipo è sufficiente:

PHP:
$row = $res->fetch_assoc();

Se hai però più record, allora non puoi fare in questo modo. Dovresti usare un ciclo while, e modificare anche la tua SELECT per far tornare un campo univoco (immagino ci sia un ID auto increment in quella tabella) che utilizzerai per l'update.

Una cosa di questo tipo:

PHP:
$request1 = "SELECT id, n_package FROM destination WHERE country= '$location' ";
// ...

while ($row = $res->fetch_assoc()) {
         // il tuo codice con gli IF e l'update va qui dentro
        // L'update presumibilmente sarà tipo:
        $request2 = "UPDATE destination SET n_package=n_package-1 WHERE id = " . $row['id'];
}

Nell'update, in questo caso, non ti serve specificare "country" in quanto l'hai già usato come "filtro" nella SELECT, quindi tutti gli elementi che hai ottenuto (ID e N_PACKAGE) hanno già quella "country".


PS: come ti diceva giustamente ibernato ricordati di sanificare i dati, e sarebbe meglio usare dei prepared statement. Il tuo codice è a rischio di SQL Injection.
 

Xenex134

Nuovo Utente
36
3
ho un solo record salvato quindi ho provato a fare così ma mi dà questo
errore dopo aver fatto il submit della form :

Fatal error: Uncaught Error: Call to a member function fetch_assoc() on bool in C:\Users\Marco\Desktop\JP\book_form.php:29 Stack trace: #0 {main} thrown in C:\Users\Marco\Desktop\JP\book_form.php on line 29







PHP:
<?php

$msg1 = 'Non hai riempito tutti i campi !' ;
$msg2 = 'Richiesta di prenotazione effettuata con successo' ;
$msg3 = 'Non ci sono pacchetti disponibili per questa destinazione ';



   $connection = mysqli_connect('localhost','root','','book_db');

  



 if(isset($_POST['send'])){
      $name = $_POST['name'];
      $email = $_POST['email'];
      $phone = $_POST['phone'];
      $address = $_POST['address'];
      $location = $_POST['location'];
      $guests = $_POST['guests'];
      $arrivals = $_POST['arrivals'];
      $leaving = $_POST['leaving'];
 

      $request1 = "SELECT n_package FROM destination WHERE country= '$location' ";
      $res =  mysqli_query($connection, $request1);
      
      $row = $res->fetch_assoc();



      if(empty($name) || empty($email) || empty($phone) || empty($address) || empty($location) || empty($guests) || empty($arrivals) || empty($leaving))
          {     
            echo '<script>
            alert("'.$msg1.'");
             </script>';


                   }

        else if($row>0) {
              //scala di 1
         $request2 = "UPDATE destination SET n_package=n_package-1 WHERE country= '$location' ";
         mysqli_query($connection, $request2);
            
           echo '<script>
            alert("'.$msg2.'");
             </script>';
                       }
          
         else if($row<1){
            echo '<script>
            alert("'.$msg3.'");
            </script>';

                      }

                     }
else {


echo 'qualcosa è andato storto riprova di nuovo !';
   }



?>
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Devi guardare cosa torna da questo $res = mysqli_query($connection, $request1);.
Molto probabilmente $res è false, segno che non sei collegato al db oppure che hai errori nei campi della query.

Te lo dice anche la documentazione:

Returns false on failure. For successful queries which produce a result set, such as SELECT, SHOW, DESCRIBE or EXPLAIN, mysqli_query() will return a mysqli_result object. For other successful queries, mysqli_query() will return true.
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili