Ciclo while che non funziona

Ciao a tutti!

Da non credere una cavolata mi stà facendo impazzire...

Allora questo è il codice:

   
while(ChkRecord(user, id_cliente, $id_cliente))
 {
   $id_cliente ++;
 }

dove ChkRecord è una funzione creata ad hoc da me

function ChkRecord($tabella, $colonna, $valore)
    {
    $result = mysql_query("SELECT * FROM $tabella WHERE $colonna = '$valore'");
    if (! $result )
    die (" Errore di ChkRecord: ".mysql_error());
    return mysql_num_rows($result);
    }

Il problema è che quando esegue il ciclo while ne fà uno e poi si ferma. :tichedoff: quando dovrebbe eseguirlo fino a che la funzione restituisce 0...

Cosa sbaglio???

grazie!

 :bye:

inviato 9 anni fa
Marco Dario
X 0 X

while(ChkRecord('user', 'id_cliente', $id_cliente))

Secondo me è questo il problema, prova.

risposto 9 anni fa
LonelyWolf
X 0 X

Negativo.

Ho provato per scrupolo, ma quella funzione la uso anche per altre query e funziona perfettamente...

Secondo te cosa può essere?  :'(

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

Può essere che esegue sempre il die dato che non è chiuso nelle { } dell'if?

l'ho visto adesso adesso! :D

risposto 9 anni fa
LonelyWolf
X 0 X

Cioè dici così?

function ChkRecord($tabella, $colonna, $valore)
    {
    $result = mysql_query("SELECT * FROM $tabella WHERE $colonna = '$valore'");
    if (! $result );
    die (" Errore di ChkRecord: ".mysql_error());
    return mysql_num_rows($result);
    }

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

Ho provato anche così ma non funziona...

function ChkRecord($tabella, $colonna, $valore)
    {
    $result = mysql_query("SELECT * FROM $tabella WHERE $colonna = '$valore'");
    if (! $result )
     {
         die (" Errore di ChkRecord: ".mysql_error());
     }
    return mysql_num_rows($result);
    }

Ti ripeto secondo me dovremmo concebtrarci sul ciclo WHILE.  :'(

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

Hai ragione, è che sono un po' incasinato oggi, comunque nella funzione lascia le { } per il die e poi da qualche parte ho letto (anche se non ricordo più dove) che 0 non è equivalente a falso quindi la condizione cambiala in:

while(ChkRecord(user, id_cliente, $id_cliente)!=0)
risposto 9 anni fa
LonelyWolf
X 0 X

Negativo....  :'(

while(ChkRecord(user, id_cliente, $id_cliente)!=0)
   {
      $id_cliente ++;
   }

Sempre il solito discorso! Ho anche lasciato le graffe...

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

ma qual'è lo scopo di questa "mitragliata" di query?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Sei sicuro che la connessione con mysql sia aperta?

Perchè a questo punto è l'unica cosa che mi viene in mente!

Dovresti anche provare a controllare il valore restituito dalla funzione all'interno del ciclo while e non come condizione e già che ci sei anche $idcliente.

risposto 9 anni fa
LonelyWolf
X 0 X
ma qual'è lo scopo di questa "mitragliata" di query?

Ciao gianni....  ;)

Vi riporto tutto il codice:

function genidclii($nome)
{

$lettere = strtoupper (preg_replace('/[^a-z]/i','',$nome));

$lettera1 = substr($lettere, 0, 1); 
$lettera2 = substr($lettere, 1, 1); 
$lettera3 = substr($lettere, 2, 1);


   switch ($lettera1)
   {
   case A:
        $id_cliente .= "01";
        break;
    case B:
        $id_cliente .= "02";
        break;
   case C:
        $id_cliente .= "03";
        break;
    case D:
        $id_cliente .= "04";
        break;
   case E:
        $id_cliente .= "05";
        break;
    case F:
        $id_cliente .= "06";
        break;
   case G:
        $id_cliente .= "07";
        break;
   case H:
        $id_cliente .= "08";
         break;
    case I:
        $id_cliente .= "09";
        break;
   case J:
        $id_cliente .= "10";
        break;
    case K:
        $id_cliente .= "11";
        break;
   case L:
        $id_cliente .= "12";
        break;
   case M:
        $id_cliente .= "13";
        break;
    case N:
        $id_cliente .= "14";
        break;
   case O:
        $id_cliente .= "15";
        break;
    case P:
        $id_cliente .= "16";
        break;
   case Q:
        $id_cliente .= "17";
        break;
   case R:
        $id_cliente .= "18";
         break;
    case S:
        $id_cliente .= "19";
        break;
   case T:
        $id_cliente .= "20";
        break;
    case U:
        $id_cliente .= "21";
        break;
   case V:
        $id_cliente .= "22";
        break;
   case W:
        $id_cliente .= "23";
         break;
    case Z:
        $id_cliente .= "24";
        break;
}

switch ($lettera2)
{
   case A:
        $id_cliente .= "01";
        break;
    case B:
        $id_cliente .= "02";
        break;
   case C:
        $id_cliente .= "03";
        break;
    case D:
        $id_cliente .= "04";
        break;
   case E:
        $id_cliente .= "05";
        break;
    case F:
        $id_cliente .= "06";
        break;
   case G:
        $id_cliente .= "07";
        break;
   case H:
        $id_cliente .= "08";
         break;
    case I:
        $id_cliente .= "09";
        break;
   case J:
        $id_cliente .= "10";
        break;
    case K:
        $id_cliente .= "11";
        break;
   case L:
        $id_cliente .= "12";
        break;
   case M:
        $id_cliente .= "13";
        break;
    case N:
        $id_cliente .= "14";
        break;
   case O:
        $id_cliente .= "15";
        break;
    case P:
        $id_cliente .= "16";
        break;
   case Q:
        $id_cliente .= "17";
        break;
   case R:
        $id_cliente .= "18";
         break;
    case S:
        $id_cliente .= "19";
        break;
   case T:
        $id_cliente .= "20";
        break;
    case U:
        $id_cliente .= "21";
        break;
   case V:
        $id_cliente .= "22";
        break;
   case W:
        $id_cliente .= "23";
         break;
    case Z:
        $id_cliente .= "24";
        break;
}

switch ($lettera3)
{
   case A:
        $id_cliente .= "01";
        break;
    case B:
        $id_cliente .= "02";
        break;
   case C:
        $id_cliente .= "03";
        break;
    case D:
        $id_cliente .= "04";
        break;
   case E:
        $id_cliente .= "05";
        break;
    case F:
        $id_cliente .= "06";
        break;
   case G:
        $id_cliente .= "07";
        break;
   case H:
        $id_cliente .= "08";
         break;
    case I:
        $id_cliente .= "09";
        break;
   case J:
        $id_cliente .= "10";
        break;
    case K:
        $id_cliente .= "11";
        break;
   case L:
        $id_cliente .= "12";
        break;
   case M:
        $id_cliente .= "13";
        break;
    case N:
        $id_cliente .= "14";
        break;
   case O:
        $id_cliente .= "15";
        break;
    case P:
        $id_cliente .= "16";
        break;
   case Q:
        $id_cliente .= "17";
        break;
   case R:
        $id_cliente .= "18";
         break;
    case S:
        $id_cliente .= "19";
        break;
   case T:
        $id_cliente .= "20";
        break;
    case U:
        $id_cliente .= "21";
        break;
   case V:
        $id_cliente .= "22";
        break;
   case W:
        $id_cliente .= "23";
         break;
    case Z:
        $id_cliente .= "24";
        break;
}

$id_cliente .="001";

echo $id_cliente ."</br>";


         while(ChkRecord(user, id_cliente, $id_cliente)!="0")
            {
               $id_cliente ++;
            }

   
$a = $id_cliente;
if(strlen($a) < 9)
{
   
   $a = "0".$a;
}
echo $a;
}


if (isset($_POST["actionflag"]) && $_POST["actionflag"]=="submit")
{
genidclii($_POST['nome']);
}

Lo scopo è generare un'id cliente in base alle prime 3 lettere del suo nome. Se nel DB c'è già implementa gli ultimi 3 numeri dell'id cliente:

...001

...002

...003

ecc.

Dovrebbe farlo con il ciclo while:

while(ChkRecord(user, id_cliente, $id_cliente)!=0)

{

      $id_cliente ++;

}

Ma non lo fà...  :tichedoff:

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

Ho provato a far stampare il risultato della query e stampa uno quando trova un'id cliente uguale.

Quindi la funzione con la query fà il suo dovere...

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

Qua non ci vogliono " lo 0 è numero non carattere:

   

while(ChkRecord(user, id_cliente, $id_cliente)!="0")
{
   $id_cliente ++;
}

e controlla che idcliente rimanga sempre numerico.

risposto 9 anni fa
LonelyWolf
X 0 X

Ho provato anche senza apici e virgolette varie...  ma il risultato è sempre quello :tichedoff: :'(

e controlla che idcliente rimanga sempre numerico.

Cosa intendi che rimanga sempre numerico?

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

Eccomi quì...

A pancia piena si ragiona meglio...  ;D Ecco l'errore:

while(ChkRecord(user, id_cliente, $id_cliente) != 0 )
    {
       $id_cliente ++;
    }

$a = $id_cliente;

if(strlen($a) < 9)
 {
    $a = "0".$a;
 }
echo $a;

Ecco il codice corretto!

while(!ChkRecord(user, id_cliente, $id_cliente) == 0 )
   {
      $id_cliente ++;
      if(strlen($id_cliente) < 9)
         {
            $id_cliente = "0".$id_cliente;
         }
               
   }

In pratica quando fà la somma $id_cliente ++; gli zeri iniziali vengono eliminati. Me ne ero già accorto, ma stupidamente non ho fatto conto che se ne accorgeva anche il ciclo while!  :idiot:

Grazie di tutto ancora a LonelyWolf e Gianni!

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

non ho fatto nulla... comunque una risposta alla mia domanda non l'ho ricevuta  :-\ sono curioso di capire il funzionamento e lo scopo di quel codice.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Era quello che intendevo, anche se non l'ho espresso correttamente!

Gianni vedendo il codice credo che il ciclo non serva a controllare tutti i codici cliente, ma solo se ne esista uno in particolare ovvero quello che sta creando al momento.

Ipotizziamo 3 clienti:

pincopallino

pincopalla

pincopallone

le prime tre lettere sono identiche per cui la prima parte di codice è uguale, quando genera il codice del secondo cliente aggiunge 001 e controlla se c'è già, per il terzo cliente idem, ma pin presente, pin001 presente pin002 manca quindi lo aggiunge. Se ci fosse un pinup, stessa storia fino ad arrivare a pin003.

Ovviamente non mantiene pin in lettere ma diventano numeri, non avevo voglia di farlo manualmente! :D

risposto 9 anni fa
LonelyWolf
X 0 X

BRAVISSSSSSIMO LonelyWolf

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

considera questo approccio:

<?php
$nome = "ABCCICCIO";

$codice = mycode($nome[0]) . mycode($nome[1]) . mycode($nome[2]);

echo $codice ."\n";

$query = "SELECT colonna FROM tabella WHERE colonna LIKE '$codice%' ORDER BY colonna DESC LIMIT 1";

echo $query . "\n";

// supponiamo che restituisce...
$risultato = "010203004";

if($risultato)
{
   $risultato = substr($risultato, -1, 3);
   $nuovo_codice = $codice . str_pad($risultato+1,3,'0',STR_PAD_LEFT);
   
}
else
{
   $nuovo_codice = $codice . '001';
}

echo "Nuovo codice: " . $nuovo_codice;

function mycode($char)
{
   return str_pad(ord($char) - 64,2,'0',STR_PAD_LEFT);
}
?>

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Non ho capito molto del codice che hai postato...  ???

Mi spieghi nel dettaglio cosa vorresti fare Gianni?

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

quel codice fa esattamente quello che stai cercando di fare tu. Nel codice la query è solo dichiarata, non eseguita. Il risultato è quindi simulato. Prova ad eseguirlo e vedi cosa produce.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Ecco una spiegazione + dettagliata del codice che ho proposto:

Le prime 3 lettere del codice sono ricavate dalle prime tre lettere del nome. Per ciascuna delle tre lettere la funzione mycode calcola un numero che ne identifica la posizione nell'alfabeto:

Posizione nell'alfabeto:

ord($char) - 64

Il numero deve essere per forza a 2 cifre. Se serve va messo un 0 all'inizio:

str_pad(ord($char) - 64,2,'0',STR_PAD_LEFT);

ottenuti i tre numeri associati alle tre lettere, li inserisco nella variabile $codice:

$codice = mycode($nome[0]) . mycode($nome[1]) . mycode($nome[2]);

A questo punto cerco nel DB la riga con un codice che inizia esattamente come il codice che ho appena calcolato. In particolare prendo la riga che ha l'ulteriore indice, alla destra del codice, più grande. Per farlo gioco con l'ordinamento delle righe:

$query = "SELECT colonna FROM tabella WHERE colonna LIKE '$codice%' ORDER BY colonna DESC LIMIT 1";

LIKE '$codice%' mi permette di prendere tutte le righe che iniziano con il codice cercato

ORDER BY colonna DESC LIMIT 1 considera solo la prima tra le righe trovate, quella che con l'ordinamento alfabetico discendente è risultata la prima, che coincide con quella che ha l'indice finale più grande.

Nell'esempio non ho eseguito realmente la query ma ho supposto che il risultato della stessa venga salvato nella variabile $risultato

Se $risultato è vuoto allora non esiste nessuna riga nel database con quel codice iniziale. Allora l'indice finale da accodare al codice sarà 001

Altrimenti devo estrarre l'indice finale trovato nella riga del DB:

substr($risultato, -1, 3)

incrementarlo di 1:

$risultato+1

e poi aggiungere un numero sufficiente di zeri all'inizio in modo che l'indice divenga di 3 cifre:

str_pad($risultato+1,3,'0',STR_PAD_LEFT);

FINE.  :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda