Visualizzazione risultati 1 fino 13 di 13

Discussione: Problema con QUERY PHP

  1. #1
    Guest

    Predefinito Problema con QUERY PHP

    Salve a tutti,
    ho un problema con questo codice php:
    Codice PHP:
    $dataarrivo=strtotime($check_in);
    $datapartenza=strtotime($check_out);
    $sel = mysql_query("SELECT checkIn, checkOut FROM prenotazioni WHERE id_appartamento='$appartamento'",$conn);
    $i = 0;

    while(
    $row = mysql_fetch_assoc($sel))
    {
    //echo $i;
    $date_in=strtotime($row["checkIn"]);
    $date_out=strtotime($row["checkOut"]);
    if (((
    $date_in>=$dataarrivo)&&($date_in<=$datapartenza))||(($date_out>=$dataarrivo)&&($date_out<=$datapartenza))||(($date_in<=$dataarrivo)&&($date_out>=$datapartenza)))
    {
    $i=1;
    break;
    }
    }
    if (
    $i == 0)
    {

    }
    else
    {

    }
    sostanzialmente devo gestire le prenotazioni relative agli appartamenti di un certo agriturismo tramite un form in cui faccio inserire i dati nacessari.
    Il problema giunge quando devo verificare se esiste già una prenotazione per la stanza e il periodo selezionato; quindi con la query metto in $sel tutte le prenotazioni relative all'appartamento selezionato dall'utente e le vado ad "analizzare" una per una nel ciclo. Controllo poi se è già presente una prenotazione per quel periodo.
    Il problema è che mi inserisce nel DB tutto ciò che gli passo, anche quando vado a mettere un periodo "occupato", mettendo //echo $i all'interno del ciclo mi sembra di aver capito che il problema sta nel fatto che dentro a questo ciclo proprio non ci entra, ma non capisco perché!
    Qualcuno saprebbe dirmi dove è oppure quale potrebbe essere l'errore?
    GRAZIE

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    In verità non avresti bisogno di un ciclo se
    Codice:
    id_appartamento
    è come chiave primaria o unica (se è numerico ed intero senza apici singoli nella query). Non ho capito bene invece la gestione della verifica? Vuoi verificare che l'id_appartamento sia occupato o no? Semplice senza while avrai la matrice $row['checkIn'] e $row['checkOut'] che è già presente nel tuo database, devi solo verifiare il checkIn e checkOut che recupererai dal tuo form tramite una richiesta POST o GET. (queste ti servono per confrontarle con quelle del database).
    Codice PHP:
    $sel = mysql_query("SELECT checkIn, checkOut FROM prenotazioni WHERE id_appartamento='$appartamento' AND checkIn='$dataarrivo' AND checkOut='$datapartenza'",$conn);
    Se già esiste la trova altrimenti la query fallisce.
    Ultima modifica di darbula : 25-09-2015 alle ore 18.09.50

  3. #3
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    In verità non avresti bisogno di un ciclo se
    Codice:
    id_appartamento
    è come chiave primaria o unica (se è numerico ed intero senza apici singoli nella query). Non ho capito bene invece la gestione della verifica? Vuoi verificare che l'id_appartamento sia occupato o no? Semplice senza while avrai la matrice $row['checkIn'] e $row['checkOut'] che è già presente nel tuo database, devi solo verifiare il checkIn e checkOut che recupererai dal tuo form tramite una richiesta POST o GET. (queste ti servono per confrontarle con quelle del database).
    Codice PHP:
    $sel = mysql_query("SELECT checkIn, checkOut FROM prenotazioni WHERE id_appartamento='$appartamento' AND checkIn='$dataarrivo' AND checkOut='$datapartenza'",$conn);
    Se già esiste la trova altrimenti la query fallisce.
    id_appartamento non è chiave primaria, né unica, è la chiave esterna della tabella appartamenti!
    la query come hai scritto tu non va bene, perché è valida soltanto per i casi in cui le date siano identiche, invece io devo considerare pure le circostanza in cui ad esempio l'utente inserisce come intervallo: 1 Gennaio-7 Gennaio ed è presente nel DB una prenotazione ad esempio: 4 Gennaio-10 Gennaio!
    ho provato con la clausola BETWEEN ma non viene comunque
    Ultima modifica di andreabenincasa : 25-09-2015 alle ore 18.41.49

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Il problema non è la variabile $i quindi elimina //echo $i, ma la prima condizione dentro l'if, perciò siccome i dati provengono da un form (o tramite script) devi prima verificarli con un if poi effettuare la query
    Codice PHP:
    if($dataarrivo<=$datapartenza){codice};
    . In base la risposta che mi hai dato prima ho preparato questo esempio che stampa 1 cioè true
    Codice PHP:
    ]<?php
    //esempio non reale
    $date_in=4; //dati db con strtotime
    $date_out=10; //dati db con strtotime
    $dataarrivo=1; //dati form con strtotime
    $datapartenza=7; // dati form con strtotime

    $risult1='';
    $risult2='';
    $risult3='';
    $risult4='';

    /*if ((($date_in>=$dataarrivo)&&($date_in<=$datapartenza))||(($date_out>=$dataarrivo)&&($date_out<=$datapartenza))||(($date_in<=$dataarrivo)&&($date_out>=$datapartenza)))*/

    if (($risult1=(($date_in>=$dataarrivo)&&($date_in<=$datapartenza)))){
    }
    if ((
    $risult2=($date_out>=$dataarrivo)&&($date_out<=$datapartenza))){
    }
    if (
    $risult3=(($date_in<=$dataarrivo)&&($date_out>=$datapartenza))){
    }

    //la mia condizione per eseguire l'inserimento
    // si noti che per invertire il valore booleano si può usare il !
    if ($dataarrivo<=$datapartenza){
    if((
    $risult4=($date_out<=$dataarrivo || $date_in>=$datapartenza))){
    }
    }
    echo(
    $risult1.$risult2.$risult3.$risult4);
    ?>
    tengo a precisare che non mi ritengo responsabile se lo script sia malfunzionante.
    Ultima modifica di darbula : 26-09-2015 alle ore 01.53.48

  5. #5
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Il problema non è la variabile $i quindi elimina //echo $i, ma la prima condizione dentro l'if, perciò siccome i dati provengono da un form (o tramite script) devi prima verificarli con un if poi effettuare la query
    Codice PHP:
    if($dataarrivo<=$datapartenza){codice};
    . In base la risposta che mi hai dato prima ho preparato questo esempio che stampa 1 cioè true
    Codice PHP:
    <?php
    //esempio non reale
    $date_in=4; //dati db con strtotime
    $date_out=10; //dati db con strtotime
    $dataarrivo=1; //dati form con strtotime
    $datapartenza=7; // dati form con strtotime

    $risult1='';
    $risult2='';
    $risult3='';
    $risult4='';

    /*if ((($date_in>=$dataarrivo)&&($date_in<=$datapartenza))||(($date_out>=$dataarrivo)&&($date_out<=$datapartenza))||(($date_in<=$dataarrivo)&&($date_out>=$datapartenza)))*/

    if (($risult1=(($date_in>=$dataarrivo)&&($date_in<=$datapartenza)))){
    }
    if ((
    $risult2=($date_out>=$dataarrivo)&&($date_out<=$datapartenza))){
    }
    if (
    $risult3=(($date_in<=$dataarrivo)&&($date_out>=$datapartenza))){
    }

    //la mia condizione per eseguire l'inserimento
    // si noti che per invertire il valore booleano si può usare il !
    if ($dataarrivo<=$datapartenza){
    if((
    $risult4=($date_out<=$dataarrivo || $date_in>=$datapartenza))){
    }
    }
    echo(
    $risult1.$risult2.$risult3.$risult4);
    ?>
    tengo a precisare che non mi ritengo responsabile se lo script sia malfunzionante.
    perdona la mia ignoranza ma non sono riuscito a capire quello che vuoi dirmi!
    echo$i io l'ho inserito solo per verificare se mi entrava una volta nel ciclo, ma quando mando in esecuzione non me lo stampa, quindi ho supposto che non entrasse mai nel ciclo, poiché, appunto, mi stampa in ogni caso la pagina di avvenuta prenotazione, che dovrebbe stampare nel caso in cui $i == 0
    avendo quindi supposto che non entrasse nel ciclo, e quindi che tale condizione fosse falsa, pensavo che ci fosse qualche problema nella query, o nelle funzioni utilizzate.
    detto questo non sono riuscito bene a capire cosa volevi dirmi tu!
    Ultima modifica di andreabenincasa : 26-09-2015 alle ore 01.08.28

  6. #6
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ciao a me lo script funziona, ho creato nel database un campo id_appartamento con valore 1 checkIn con valore 25-09-2015 checkOut con valore 26-09-2015, id_appartamento con valore 1 checkIn con valore 26-09-2015 checkOut con valore 27-09-2015 (nessun indice,primaria,esterna,unique)
    Codice PHP:
    <?php
    // es. dati form
    $check_in='26-09-2015';
    $check_out='27-09-2015';

    //conversione data europea in timestamp
    $dataarrivo=strtotime($check_in);
    $datapartenza=strtotime($check_out);
    $appartamento=1;
    //controllo se la data sia corretta
    if($dataarrivo>$datapartenza){
    echo
    'data non valida';
    exit(
    1);
    }

    require_once
    'connettixampp2.php';
    //query database
    $sel = mysql_query("SELECT checkIn, checkOut FROM prenotazioni WHERE id_appartamento='$appartamento'",$con);
    $i=0;
    // query fallita
    if(!$sel){
    echo
    'query fallita: '.mysql_error();
    exit(
    2);
    }

    while(
    $row = mysql_fetch_assoc($sel))
    {
    $date_in=strtotime($row["checkIn"]);
    $date_out=strtotime($row["checkOut"]);
    if (((
    $date_in>=$dataarrivo)&&($date_in<=$datapartenza))||(($date_out>=$dataarrivo)&&($date_out<=$datapartenza))||(($date_in<=$dataarrivo)&&($date_out>=$datapartenza)))
    {
    $i=1;
    echo
    'data presente nel database';
    break;
    }
    }
    mysql_free_result($sel);
    mysql_close($con);
    if (
    $i == 0)
    {
    echo
    'data non presente nel database';
    }
    ?>
    EDIT: L'unica soluzione è fare il debug di tutto il codice per capire dov'è l'errore.
    Ultima modifica di darbula : 26-09-2015 alle ore 18.26.48

  7. #7
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Ciao a me lo script funziona, ho creato nel database un campo id_appartamento con valore 1 checkIn con valore 25-09-2015 checkOut con valore 26-09-2015, id_appartamento con valore 1 checkIn con valore 26-09-2015 checkOut con valore 27-09-2015 (nessun indice,primaria,esterna,unique)
    Codice PHP:
    <?php
    // es. dati form
    $check_in='26-09-2015';
    $check_out='27-09-2015';

    //conversione data europea in timestamp
    $dataarrivo=strtotime($check_in);
    $datapartenza=strtotime($check_out);
    $appartamento=1;
    //controllo se la data sia corretta
    if($dataarrivo>$datapartenza){
    echo
    'data non valida';
    exit(
    1);
    }

    require_once
    'connettixampp2.php';
    //query database
    $sel = mysql_query("SELECT checkIn, checkOut FROM prenotazioni WHERE id_appartamento='$appartamento'",$con);
    $i=0;
    // query fallita
    if(!$sel){
    echo
    'query fallita: '.mysql_error();
    exit(
    2);
    }

    while(
    $row = mysql_fetch_assoc($sel))
    {
    $date_in=strtotime($row["checkIn"]);
    $date_out=strtotime($row["checkOut"]);
    if (((
    $date_in>=$dataarrivo)&&($date_in<=$datapartenza))||(($date_out>=$dataarrivo)&&($date_out<=$datapartenza))||(($date_in<=$dataarrivo)&&($date_out>=$datapartenza)))
    {
    $i=1;
    echo
    'data presente nel database';
    break;
    }
    }
    mysql_free_result($sel);
    mysql_close($con);
    if (
    $i == 0)
    {
    echo
    'data non presente nel database';
    }
    ?>
    EDIT: L'unica soluzione è fare il debug di tutto il codice per capire dov'è l'errore.

    oggi ho provato a semplificare il problema per capire dove potrebbe essere l'errore, implementando questo script:
    Codice PHP:
    <?php
    $servername
    = "localhost";
    $username = "root";
    $password = "";
    $dbname = "agriturismo";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) {
    die(
    "Connection failed: " . $conn->connect_error);
    }

    $i=1;

    $sel = mysql_query("SELECT checkIn, checkOut FROM prenotazioni",$conn);


    if (
    mysqli_num_rows($sel) > 0) {
    // output data of each row
    while($row = mysqli_fetch_assoc($sel)) {
    echo
    "check in: " . $row[0]. " - check out: " . $row[2]."<br>";
    }
    } else {
    echo
    "0 results";
    }

    mysqli_close($conn);
    ?>
    ed eseguendolo ho constatato che, nonostante nel DB fossero presenti delle tuple, mi da sempre "0 result", quindi presumo che l'errore ruoti attorno alla query! Ma non riesco a capire cosa!
    non riesco a capire come possa funzionare a te, o meglio, perché non funziona a me!!!
    Ultima modifica di andreabenincasa : 26-09-2015 alle ore 18.48.51

  8. #8
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    aggiungi
    Codice PHP:
    if(!$sel)
    {
    echo
    'query fallita: '.mysqli_error();
    exit;
    }
    vediamo che errore dice mysql!! Ma credo che il problema sia la chiave esterna. http://www.html.it/articoli/foreign-...le-in-mysql-1/
    Ultima modifica di darbula : 26-09-2015 alle ore 20.42.07

  9. #9
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    aggiungi
    Codice PHP:
    if(!$sel)
    {
    echo
    'query fallita: '.mysqli_error();
    exit;
    }
    vediamo che errore dice mysql!! Ma credo che il problema sia la chiave esterna. http://www.html.it/articoli/foreign-...le-in-mysql-1/
    mi mostra "query fallita:" e poi tutto bianco... non dice l'errore!
    ho provato ad eseguire pure togliendo la condizione WHERE, ma niente, non riesce comunque!!

  10. #10
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Codice PHP:
    string mysqli_error ( mysqli $link )
    php.net/manual/en/mysqli.error.php ops ho sbagliato la sintassi è questa per mysqli, scusa. Ma soprattutto la giusta sintassi per la query mysqli è
    Codice PHP:
    mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
    Dove ovviamente fai uso di mysql o mysqli e non entrambe. (darà sempre errore).
    EDIT: sarebbe qualcosa del genere, però poiché non capisco l'object in generale non escludo che la sintassi possa essere diversa,cmq. a me recupera i dati
    Codice PHP:
    <?php
    error_reporting
    (E_ALL | E_NOTICE | E_STRICT | E_DEPRECATED); //5.3
    ini_set("display_errors" , "stdout");
    ini_set("display_startup_errors" , 1);
    //Dati form
    $dataarrivo=strtotime($check_in);
    $datapartenza=strtotime($check_out);

    //controllo se la data sia corretta
    if($dataarrivo>$datapartenza){
    echo (
    'la data di partenza non può essere superiore dalla data d\'arrivo dal'.date('d-m-y',$dataarrivo).' al '.date('d-m-y',$datapartenza));
    exit(
    1);
    }
    $servername = 'localhost';
    $username = 'root';
    $password = '';
    $dbname ='agriturismo';

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    /*
    * This is the "official" OO way to do it,
    * BUT $connect_error was broken until PHP 5.2.9 and 5.3.0.
    */
    // Check connection
    if ($conn->connect_errno) {
    echo (
    'Connection failed: ' . $conn->connect_error);
    exit(
    2);
    }

    /*
    * Use this instead of $connect_error if you need to ensure
    * compatibility with PHP versions prior to 5.2.9 and 5.3.0.
    if (mysqli_connect_error()) {
    die('Connect Error (' . mysqli_connect_errno() . ') '
    . mysqli_connect_error());
    }*/



    if (!($sel = $conn->query("SELECT checkIn, checkOut FROM prenotazioni WHERE id_appartamento='$appartamento'"))) {
    echo (
    'Query failed'.$conn->error);
    exit(
    3);
    }
    if(
    $sel->num_rows>0){
    // output data of each row
    while ($row = $sel->fetch_assoc()) {
    $date_in=strtotime($row['checkIn']);
    $date_out=strtotime($row['checkOut']);
    if (((
    $date_in>=$dataarrivo)&&($date_in<=$datapartenza))||(($date_out>=$dataarrivo)&&($date_out<=$datapartenza))||(($date_in<=$dataarrivo)&&($date_out>=$datapartenza)))
    {
    $i=1;
    echo (
    'camera non disponibile dal '.date('d-m-y',$dataarrivo).' al '.date('d-m-y',$datapartenza));
    break;
    }
    else {
    $i=0;
    }
    }

    $sel->close();
    $conn->close();
    } else {
    $i=1;
    echo
    '0 results';
    }
    if (
    $i == 0)
    {
    echo (
    'camera disponibile dal '.date('d-m-y',$dataarrivo).' al '.date('d-m-y',$datapartenza));
    }
    ?>
    EDIT2: Creato workaround per $i anche in caso di non interruzione di una query errata (dai miei test effettuati con id_appartamento inesistente la query non segnalava l'errore). Mentre con una query del tipo ciao ovviamente mi segnala l'errore.
    EDIT3: Se provi
    Codice:
    SELECT checkIn, checkOut FROM prenotazioni WHERE id_appartamento='$appartamento' ORDER BY checkIn DESC LIMIT 2
    su phpmyadmin che errore ti dice? (dove in $appartamento modifichi con il suo reale valore, se è un intero non va racciuso in apici singoli)
    Ultima modifica di darbula : 27-09-2015 alle ore 20.32.58

  11. #11
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Codice PHP:
    string mysqli_error ( mysqli $link )
    php.net/manual/en/mysqli.error.php ops ho sbagliato la sintassi è questa per mysqli, scusa. Ma soprattutto la giusta sintassi per la query mysqli è
    Codice PHP:
    mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
    Dove ovviamente fai uso di mysql o mysqli e non entrambe. (darà sempre errore).
    EDIT: sarebbe qualcosa del genere, però poiché non capisco l'object in generale non escludo che la sintassi possa essere diversa,cmq. a me recupera i dati
    Codice PHP:
    <?php
    error_reporting
    (E_ALL | E_NOTICE | E_STRICT | E_DEPRECATED); //5.3
    ini_set("display_errors" , "stdout");
    ini_set("display_startup_errors" , 1);
    //Dati form
    $dataarrivo=strtotime($check_in);
    $datapartenza=strtotime($check_out);

    //controllo se la data sia corretta
    if($dataarrivo>$datapartenza){
    echo (
    'la data di partenza non può essere superiore dalla data d\'arrivo dal'.date('d-m-y',$dataarrivo).' al '.date('d-m-y',$datapartenza));
    exit(
    1);
    }
    $servername = 'localhost';
    $username = 'root';
    $password = '';
    $dbname ='agriturismo';

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    /*
    * This is the "official" OO way to do it,
    * BUT $connect_error was broken until PHP 5.2.9 and 5.3.0.
    */
    // Check connection
    if ($conn->connect_errno) {
    echo (
    'Connection failed: ' . $conn->connect_error);
    exit(
    2);
    }

    /*
    * Use this instead of $connect_error if you need to ensure
    * compatibility with PHP versions prior to 5.2.9 and 5.3.0.
    if (mysqli_connect_error()) {
    die('Connect Error (' . mysqli_connect_errno() . ') '
    . mysqli_connect_error());
    }*/



    if (!($sel = $conn->query("SELECT checkIn, checkOut FROM prenotazioni WHERE id_appartamento='$appartamento'"))) {
    echo (
    'Query failed'.$conn->error);
    exit(
    3);
    }
    if(
    $sel->num_rows>0){
    // output data of each row
    while ($row = $sel->fetch_assoc()) {
    $date_in=strtotime($row['checkIn']);
    $date_out=strtotime($row['checkOut']);
    if (((
    $date_in>=$dataarrivo)&&($date_in<=$datapartenza))||(($date_out>=$dataarrivo)&&($date_out<=$datapartenza))||(($date_in<=$dataarrivo)&&($date_out>=$datapartenza)))
    {
    $i=1;
    echo (
    'camera non disponibile dal '.date('d-m-y',$dataarrivo).' al '.date('d-m-y',$datapartenza));
    break;
    }
    else {
    $i=0;
    }
    }

    $sel->close();
    $conn->close();
    } else {
    $i=1;
    echo
    '0 results';
    }
    if (
    $i == 0)
    {
    echo (
    'camera disponibile dal '.date('d-m-y',$dataarrivo).' al '.date('d-m-y',$datapartenza));
    }
    ?>
    EDIT2: Creato workaround per $i anche in caso di non interruzione di una query errata (dai miei test effettuati con id_appartamento inesistente la query non segnalava l'errore). Mentre con una query del tipo ciao ovviamente mi segnala l'errore.
    EDIT3: Se provi
    Codice:
    SELECT checkIn, checkOut FROM prenotazioni WHERE id_appartamento='$appartamento' ORDER BY checkIn DESC LIMIT 2
    su phpmyadmin che errore ti dice? (dove in $appartamento modifichi con il suo reale valore, se è un intero non va racciuso in apici singoli)
    non riesco a visualizzare comunque l'errore!
    su eseguo la query direttamente su phpmyadmin mi mostra il risultato corretto

  12. #12
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ehm visto che ho previsto tutto con il mio script hai provato, cosa ti dice? Non ho idea di cosa vada storto.. Ti succede questo solo con la tabella prenotazioni del database agriturismo, se effettui query su altre tabelle ti funziona?
    Ultima modifica di darbula : 28-09-2015 alle ore 18.17.45

  13. #13
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Ehm visto che ho previsto tutto con il mio script hai provato, cosa ti dice? Non ho idea di cosa vada storto.. Ti succede questo solo con la tabella prenotazioni del database agriturismo, se effettui query su altre tabelle ti funziona?
    Sono riuscito a risolvere modificando il modo di programmare, invece che con gli oggetti, ho utilizzato i comandi procedurali ed ha funzionato senza cambiare niente altro!!! Grazie mille comunque per l'aiuto!

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
  •