Migliorare la struttura del codice e di while

di il
5 risposte

Migliorare la struttura del codice e di while

Buongiorno a tutti, premetto che non sono esperto quindi potreste trovare le mie difficoltà molto banali...
In pratica ho questo codice:

<?php
$queryCF=mysql_query("SELECT * FROM concorsofin WHERE chat_id='$queryUserID'");
$qCF=mysql_fetch_assoc($queryCF);

if ($qCF["Titolo"]=="La vita è bella" ) {
echo "Hai già inserito questo titolo";
        break;
  }else{
  while ($qCF=mysql_fetch_assoc($queryCF)) {
    if ($qCF["Titolo"]=="La vita è bella" ) {
           echo "Hai già inserito questo titolo";
            break;
  }}}
  
  $query=mysql_query("SELECT * FROM concorso WHERE chat_id='$queryUserID'");
$q=mysql_fetch_assoc($query);
       
if ($q["Titolo"]=="La vita è bella" ) {
    echo "Hai già inserito questo titolo";
  break;
  }else{
  echo "Invia il nome del titolo";
      mysql_query("INSERT INTO concorso(ID,chat_id,Username,Step,Processo,Titolo,photoID,Data) VALUES (NULL,'$queryUserID','$queryUserName','InvioFoto','foto','La vita è bella','empty','$queryOra')");
    }
break;
    
while ($q=mysql_fetch_assoc($query)) {
if ($q["Titolo"]=="La vita è bella" ) {
        echo "Hai già inserito questo titolo";
        break;
  }else{
    echo "Invia il nome del titolo";
    mysql_query("INSERT INTO concorso(ID,chat_id,Username,Step,Processo,Titolo,photoID,Data) VALUES (NULL,'$queryUserID','$queryUserName','InvioFoto','foto','La vita è bella','empty','$queryOra')");
  }  }
  ?>
In pratica funziona tutto anche se penso di aver messo qualche break di troppo...io però vorrei sintetizzare questo codice in una unica condizionale, si può fare? Faccio notare che i controlli sono fatti su due db diversi.
Poi il ciclo while se provo a metterlo in un elseif anzichè nell'else non mi funziona. Non si può fare? Grazie mille

5 Risposte

  • Re: Migliorare la struttura del codice e di while

    Mi pare di capire che la tua intenzione sia di inserire dei dati relativi a opere (film o libri) in un database verificando prima che il titolo fornito in input non sia già presente, è così?

    PS il fatto che funzioni tutto ha del miracoloso, credimi
  • Re: Migliorare la struttura del codice e di while

    Posto che ho una "certa" conoscenza di PHP, e una "certa" conoscenza di mysql, mi verrebbe da dire

    1) se hai due tabelle identiche, e non stai shardando orizzontalmente (cosa che dubito, magari non sai neppure cosa significa) hai un errore di progetto: fai una singola tabella con un campo discriminante (con relativo indice, che in questo caso può essere perfino di tipo hash)

    2) nulla ti vieta di usare SELECT * FROM concorsofin WHERE (chat_id='$queryUserID') and (titolo="la vita è bella")

    e neppure SELECT count(*) as quanti FROM concorsofin WHERE (chat_id='$queryUserID') and (titolo="la vita è bella")

    3) puoi mettere il fetch nel while

    4) nessuno "sano di mente" farebbe fare un ciclo a PHP per [3] invece di fare [2], sia per problemi di lentezza, sia per problemi di occupazione di memoria.

    5) nessuno "sano di mente" userebbe quel metodo per interrogare mysql, soprattutto se è un servizio accessibile da internet. vaga possibilità di mantenerla se lo tieni unicamente in locale (o in rete locale)

    6) il mio consiglio te lo ribadisco
    - riparti da capo, col piede giusto
    - studiati un pochino PDO (non è difficile)
    - fai uno statement preparato con i due parametri di ricerca
    - opera come ti ho suggerito

    7) se operi con più utenti, cioè non se l'unico ad usare il sistema, il metodo che utilizzi è manifestamente errato.
    nel tempo che occorre tra la verificare dell'esistenza della riga, e quella in cui viene fatta la insert, "qualcun altro" (cioè un altro utente) potrebbe lavorare.
    Dovresti quindi conoscere un minimo dell'argomento "concorrenza sui db relazionali".
    Se operi con lavori banali (che penso sia il tuo caso) puoi mettere perfino un LOCK gigante sull'intera tabella, rilasciandolo dopo i tuoi test.
    Ovviamente è un approccio che ti farebbe licenziare da una qualsiasi software house, ma per l'ambito hobbistico va bene.
  • Re: Migliorare la struttura del codice e di while

    +m2+ ha scritto:


    Posto che ho una "certa" conoscenza di PHP, e una "certa" conoscenza di mysql, mi verrebbe da dire

    1) se hai due tabelle identiche, e non stai shardando orizzontalmente (cosa che dubito, magari non sai neppure cosa significa) hai un errore di progetto: fai una singola tabella con un campo discriminante (con relativo indice, che in questo caso può essere perfino di tipo hash)

    2) nulla ti vieta di usare SELECT * FROM concorsofin WHERE (chat_id='$queryUserID') and (titolo="la vita è bella")

    e neppure SELECT count(*) as quanti FROM concorsofin WHERE (chat_id='$queryUserID') and (titolo="la vita è bella")

    3) puoi mettere il fetch nel while

    4) nessuno "sano di mente" farebbe fare un ciclo a PHP per [3] invece di fare [2], sia per problemi di lentezza, sia per problemi di occupazione di memoria.

    5) nessuno "sano di mente" userebbe quel metodo per interrogare mysql, soprattutto se è un servizio accessibile da internet. vaga possibilità di mantenerla se lo tieni unicamente in locale (o in rete locale)

    6) il mio consiglio te lo ribadisco
    - riparti da capo, col piede giusto
    - studiati un pochino PDO (non è difficile)
    - fai uno statement preparato con i due parametri di ricerca
    - opera come ti ho suggerito

    7) se operi con più utenti, cioè non se l'unico ad usare il sistema, il metodo che utilizzi è manifestamente errato.
    nel tempo che occorre tra la verificare dell'esistenza della riga, e quella in cui viene fatta la insert, "qualcun altro" (cioè un altro utente) potrebbe lavorare.
    Dovresti quindi conoscere un minimo dell'argomento "concorrenza sui db relazionali".
    Se operi con lavori banali (che penso sia il tuo caso) puoi mettere perfino un LOCK gigante sull'intera tabella, rilasciandolo dopo i tuoi test.
    Ovviamente è un approccio che ti farebbe licenziare da una qualsiasi software house, ma per l'ambito hobbistico va bene.
    Grazie per i tanti consigli che mi hai dato...ovviamente sono all'inizio e quindi alcune cose che hai detto non le ho capite. Quando sei all'inizio tutto ti sembra arabo, magari appena hai un pò di tempo potresti fare qualche esempio pratico per farmi comprendere meglio.
    Uso due tabelle proprio perchè non riesco ad avere un elemento discriminante(penso si dica così), se infatti un utente ha la sua chat-id quando inserirà più titoli sarà presente più volte e per me è complicato.
    Dove posso capirci qualcosa in più sui db?
    Grazie
  • Re: Migliorare la struttura del codice e di while

    Allora ho cercato di interpretare un pò quello che mi avete suggerito, vi dico quello che penso di aver capito e poi magari voi mi rispondete(magari con insulti se non ho capito un tubo ).
    Supponendo di avere una tabella con degli utenti, una con dei Negozi ed una per un concorso, quindi avremo:
    1) tabella: Utenti
    Composta da: "Id Utente con A.I.", "Chat_id che è univoco", "Username", "Nome o NULL", "Cognome o NULL", "Data".

    2) tabella: Negozi
    Composta da: "Id negozio A.I.", "Nome Negozio", "Settore(es:Abbigliamento)", "Luogo", "Indirizzo".

    3)Tabella: Concorso
    Composta da: "Id A.I.", Quì inserisco dalla tabella utente "Id Utente", dalla tabella Negozio "Id Negozio", "Risposta concorso", "Data".

    In pratica mi creo delle tabelle indipendenti che metto in relazione tra loro usando i vari Id univoci senza il bisogno di riscrivere tutto ogni volta.
    1)Può andare bene secodo voi?
    2)Usando altervista per le mie prove ho notato che non usa InnoDB ma MyISAM, con quale comando nel php li metto in relazione tra loro?
    3)Sono ben accetti suggerimenti anche pratici...Grazie a tutti
  • Re: Migliorare la struttura del codice e di while

    Oltre al resto ti consiglio di NON utilizzare mai piu' mysql ma di utilizzare invece mysqli (che non e' un altro database ma un altra estensione di php) siccome e' stato deprecato in php 5.5, non supporta i prepared statment, e' sia object orientated che procedural ed e' in generale piu' sicuro ed aggiornato.

    Poi quando fai qualsiasi tipo di query che richede in input dal utente dovresti sempre utilizzare mysqli_real_escape_string oppure i prepared statments altrimenti potresti facilmente incorrere in un SQL Injection
Devi accedere o registrarti per scrivere nel forum
5 risposte