Page 1 sur 2

Boucle et mysql

Posté : 08 mars 2012, 02:41
par davidb1967
Bonjour,

je suis entrain de créer une petite appli qui va me permettre de generer des codes du type

XXX1ddmmyy1001XXX1

Qui correspont a :

Photographe : XXX1
date: ddmmyy ( ex : 010212)
Carte : 1
Nb_client: 001
magasin : XXX1

Voici mon code
<?php require_once('Connections/newtrip.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
if (PHP_VERSION < 6) {
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
}

$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$insertSQL = sprintf("INSERT INTO Code_client (photographe, `date`, carte, nb_client, magazin) VALUES (%s, %s, %s, %s, %s)",
GetSQLValueString($_POST['photographe'], "text"),
GetSQLValueString($_POST['date'], "date"),
GetSQLValueString($_POST['carte'], "int"),
GetSQLValueString($_POST['nb_client'], "text"),
GetSQLValueString($_POST['magazin'], "text"));

mysql_select_db($database_newtrip, $newtrip);
$Result1 = mysql_query($insertSQL, $newtrip) or die(mysql_error());

$insertGoTo = "code_resultat.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<form action="<?php echo $editFormAction; ?>" method="post" name="form1" id="form1">
<table align="center">
<tr valign="baseline">
<td nowrap="nowrap" align="right">Photographe:</td>
<td><input type="text" name="photographe" value="" size="32" /></td>
</tr>
<tr valign="baseline">
<td nowrap="nowrap" align="right">Date:</td>
<td><input type="text" name="date" value="" size="32" /></td>
</tr>
<tr valign="baseline">
<td nowrap="nowrap" align="right">Carte:</td>
<td><input type="text" name="carte" value="" size="32" /></td>
</tr>
<tr valign="baseline">
<td nowrap="nowrap" align="right">Nb_client:</td>
<td><input type="text" name="nb_client" value="" size="32" /></td>
</tr>
<tr valign="baseline">
<td nowrap="nowrap" align="right">Magazin:</td>
<td><input type="text" name="magazin" value="" size="32" /></td>
</tr>
<tr valign="baseline">
<td nowrap="nowrap" align="right">&nbsp;</td>
<td><input type="submit" value="Créer code" /></td>
</tr>
</table>
<input type="hidden" name="MM_insert" value="form1" />
</form>
<p>&nbsp;</p>
</body>
</html>
le but de l'opration étant de créer dans la base de donnée autant d'entrée en partant de 000 que de Nb_client que j'aurai indiquer dans le champ Nb_client

pour cela je pense que je vais devoir faire une boucle. et la je bloque depuis 3 jour ou la placer et surtout comment la composer.
2eme probleme la date que me revoie la base de donnée est sous forme (ex: 2012-03-08) alors que je veux obtenir 080312.

3eme probleme (et j'arrete la ...) de la meme facon le BDD me renvois 1 au lieu de 001 pour nb_client.

je suis débutant si quelqu'un pouvais m'aider ...

merci

Re: Boucle et mysql

Posté : 08 mars 2012, 10:12
par sirakawa
Commençons par le format des codes:
le numéro d'utilisateur:
il n'a pas besoin d'être un chiffre , le déclarer varchar(6) UNIQUE
exemple d emanipulation
$num = "000001"; // valeur lue dans la BDD
$suivant = $num+1;
// $suivant vaut 2 et est transformé en chaîne 000002
$suivant = str_pad($suivant, 6, "0", STR_PAD_LEFT);
pour la date, auras-tu besoin par la suite de faire des opérations sur ces dates? Si oui, il peut être meilleur de conserver le champ date de mysql avec le type date, et de le manipuler par PHP.

Si oui: à partir de date_parse, tu devrais obtenir un tableau dont il te suffira de concaténer les parties qui t'intéressent.
Si non, tu mets ta date MYSQL comme VARCHAR et tu la gères à ton goût.

Re: Boucle et mysql

Posté : 08 mars 2012, 13:36
par davidb1967
Bonjour,

Merci sirakawa de t'etre pencher sur mon cas.

j'ai testé en declarant dans la BDD Nb_client en varchar(6) et ca fonctionne.
sachant que je ma future boucle doit incrementer ce chiffre cela restera t il toujour possible ?


Pour la date je vais avoir a la manipuler effectivement.
déja pour l'affichage finale pour n'afficher que les code des jour voulu.

J'ai pour le moment contourner le probleme en utilisant ceux ci dans ma page de resultat:
<?php echo $today = date("dmy"); ?>

Re: Boucle et mysql

Posté : 08 mars 2012, 14:22
par sirakawa
c'est à dire que, quand tu ajoutes un client "B", si le numéro de client le plus élevé est "000009", il faut que B ait le numéro "000010", je suppose.
J'ai trouvé un truc qui me plaît:
dans mon exemple
le champ varchar(6) se nomme num_text
ajouter un champ num auto_increment
tu fais l'insertion comme ceci( rien de spécial, il est inutile de s'occuper de l'auto_increment qui est géré par mysql)
insert users ( date, nom) values(NOW(), "toto");
et tu fais suivre de cette incantation
mysql> update users set num_text = lpad(last_insert_id(),6, "0") where num = last_insert_id();

je n'ai pas le courage d'expliquer, mais la doc mysql est assez claire une fois qu'on a trouvé les fonctions voulues
http://dev.mysql.com/doc/refman/5.0/fr/ ... rt-id.html

Re: Boucle et mysql

Posté : 08 mars 2012, 17:52
par davidb1967
J'ai créer une boucle mais cela ne fonctionne pas

Voici le code
<?php require_once('Connections/newtrip.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
if (PHP_VERSION < 6) {
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
}

$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$insertSQL = sprintf("INSERT INTO Code_client (photographe, `date`, carte, nb_client, magazin) VALUES (%s, %s, %s, %s, %s)",
GetSQLValueString($_POST['photographe'], "text"),
GetSQLValueString($_POST['date'], "date"),
GetSQLValueString($_POST['carte'], "int"),
GetSQLValueString($_POST['nb_client'], "text"),
GetSQLValueString($_POST['magazin'], "text"));

mysql_select_db($database_newtrip, $newtrip);
$Result1 = mysql_query($insertSQL, $newtrip) or die(mysql_error());

$insertGoTo = "code_resultat.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}

$colname_codage = "+1";
if (isset($_GET['nb_client'])) {
$colname_codage = $_GET['nb_client'];
}
mysql_select_db($database_newtrip, $newtrip);
$query_codage = sprintf("SELECT nb_client FROM Code_client WHERE nb_client < %s", GetSQLValueString($colname_codage, "text"));
$codage = mysql_query($query_codage, $newtrip) or die(mysql_error());
$row_codage = mysql_fetch_assoc($codage);
$totalRows_codage = mysql_num_rows($codage);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<form action="<?php echo $editFormAction; ?>" method="post" name="form1" id="form1">
<?php do { ?>
<table align="center">
<tr valign="baseline">
<td nowrap="nowrap" align="right">Photographe:</td>
<td><input type="text" name="photographe" value="" size="32" /></td>
</tr>
<tr valign="baseline">
<td nowrap="nowrap" align="right">Date:</td>
<td><input type="text" name="date" value="" size="32" /></td>
</tr>
<tr valign="baseline">
<td nowrap="nowrap" align="right">Carte:</td>
<td><input type="text" name="carte" value="" size="32" /></td>
</tr>
<tr valign="baseline">
<td nowrap="nowrap" align="right">Nb_client:</td>
<td><input type="text" name="nb_client" value="" size="32" /></td>
</tr>
<tr valign="baseline">
<td nowrap="nowrap" align="right">Magazin:</td>
<td><input type="text" name="magazin" value="" size="32" /></td>
</tr>
<tr valign="baseline">
<td nowrap="nowrap" align="right">&nbsp;</td>
<td><input type="submit" value="Créer code" /></td>
</tr>
</table>
<?php } while ($row_codage = mysql_fetch_assoc($codage)); ?>
<input type="hidden" name="MM_insert" value="form1" />
</form>
<p>&nbsp;</p>
</body>
</html>
<?php
mysql_free_result($codage);
?>
je doit faire une erreur quelque part sachant que cette boucle est generer par dreamweaver.

Un peu d'aide !!!

Re: Boucle et mysql

Posté : 08 mars 2012, 20:55
par sirakawa
Eh bien, si chez MM, ils faisaient, il y a dix ans, du code moins cochon que celui de Frontpage, je constate qu'ils ont plutôt régressé: entre les balises non reconnues depuis HTML 5 au moins, jusqu'aux fonctions bavardes destinées semble-t-il à couvrir toutes les versions de PHP...

Est-ce une application destinée à être diffusée à d'autres ou est-elle à usage perso, au moins ce module?

Si je m'écoutais, je dirais de tout reprendre à zéro sans s'occuper de Dreamweaver, et d'obtenir un code qui fonctionne avec simplicité:
Une page d'identification de celui qui va opérer, à moins que ce soit fait précédemment. (html, Mysql/php)
Une page demandant le nombre de clients à créer (html)
Une page faisant le travail (PHP, My, html)
Une fois opérationnel, on peut le sécuriser. En procédant ainsi, on va mieux voir où ça coïnce.

Au fait, crée-t-on des clients vides ou bien renseigne-ton tous les champs les concernant?
Si on saisit tous les renseignements, il serait, me semble-t-il, plus commode de saisir dans un tableur, d'exporter au format CSV, et d'importer dans PHP qui se chargerait du pasage vers mysql, sans qu'on ait besoin de donner le nombre de clients à traiter. Ça, je sais faire, et je ne suis pas le seul ici, si tu crains de ne pas t'en tirer.
On aurait juste besoin de dire où se trouve le fichier de données. Par expérience, je trouve plus commode de passer par le tableur, où les corrections sont plu faciles, où on peut s'interrompre et reprendre sans grands soucis...

Re: Boucle et mysql

Posté : 09 mars 2012, 00:34
par davidb1967
Je pense aussi que je vais devoir partir sur une feuille blanche.

plus simple

c'est un usage interne et personnel.

Je vais revoir ma copie

en toute cas je te remercie de tes interventions

cordialement

Re: Boucle et mysql

Posté : 09 mars 2012, 11:12
par sirakawa
Conseil pour démarrer:
créer la BDD avec les deux champs numero integer auto_increment et numero_texte varchar(6), sachant que tu n'as pas à te soucier de l'auto_increment et qu'on connait une méthode pour créer numero_texte à partir de numéro, soit immédiatement, soit après la création des comptes.

Re: Boucle et mysql

Posté : 10 mars 2012, 02:11
par davidb1967
Bonsoir,

Bon, j'ai fait le choix de travailler sur la page de resultat plutot que sur les entrer en BDD. (je verais plus tard comment le gerer au quotidien)

donc je recupére les infos dans la BDD et j'ai fait une boucle en fonction du nombre de client voulu et voici ce que j'obtiens

DAV110031210TES1
DAV110031211TES1
DAV110031212TES1
DAV110031213TES1
DAV110031214TES1
DAV110031215TES1

Pour 6 client demander

hors j'aurai voulue obtenir

DAV11003121000TES1
DAV11003121001TES1
DAV11003121002TES1
DAV11003121003TES1
DAV11003121004TES1
DAV11003121005TES1

Voici mon code:

Code : Tout sélectionner

<body> <?php $client = 000 ; $row_code_client['date'] = date("dmy"); do { echo $row_code_client['photographe']; ?><?php echo $row_code_client['date']; ?><?php echo $row_code_client['carte']; ?><?php echo $client; ?><?php echo $row_code_client['magazin'] . '<br />'; $client++ ; } while($client<$row_code_client['nb_client']); ?> </body>
je suis pas tres loin de la verité mais je bloque sur cette histoir de "000"

Merci pour votre aide

Re: Boucle et mysql

Posté : 10 mars 2012, 10:33
par sirakawa
<body>
<?php
$client = 000 ;
/*réduit à ce qui posait problème*/
do
{
//je passe par une variable intermédiaire pour éviter les changements de types sur le même nom
$str_client = str_pad($client, 4, "0", STR_PAD_LEFT); // tête de linotte!!!
print "<br>$str_client";
$client++ ;
}
while($client<11);
?>
</body>

Re: Boucle et mysql

Posté : 10 mars 2012, 13:13
par davidb1967
Yesss,

Merci, ca marche parfaitement cool...

Re: Boucle et mysql

Posté : 11 mars 2012, 03:06
par davidb1967
Bonsoir,

le generateur de code fonctionne tres bien, mais le but ultime de tout ca était de le coupler avec un générateur de code QR. j'ai trouver des source pour genérer ce code QR et integrer a la page de resultat .

Voici le code
<?php
$client = 000 ;
$row_code_client['date'] = date("dmy");
$url_prefixe= 'www.xxxxxx.fr/galerie7.php?show_heading=detail&dir=' ;


do
{

$filename="temp".session_id().".png";
QRcode::png($url_prefixe, $url_code, $filename,'S',4,1);
echo '<img src="'.$filename.'" /><br>';

echo $row_code_client['photographe']; ?><?php echo $row_code_client['date']; ?><?php echo $row_code_client['carte']; ?><?php $str_client = str_pad($client, 3, "0", STR_PAD_LEFT);

print "$str_client"; ?><?php echo $row_code_client['magazin'] . '<br />';
$client++ ;
}
while($client<$row_code_client['nb_client']);
?>
</body>
</html>
<?php
mysql_free_result($code_client);
?>
Cela fonctionne dans la boucle, hors dans la variable $url_prefixe a la suite de "dir=" il va me faloir le code correspondant que j'ai generer soit une adresse complete de type:

http://www.xxxxxx.fr/galerie7.php?show_ ... 121000XXX1

Pour que l'adresse soit complete et renvoi bien a l'album photo voulu.*

Chaque teste que j'ai pu faire pour le moment et malgre mes recherche me renvoie une erreur de syntax

J'espére ne pas trop abuser en demandant encore de l'aide pour me mettre sur la voix de la solution

Merci

Re: Boucle et mysql

Posté : 11 mars 2012, 05:03
par davidb1967
je commence a entrevoir un debut de solution
$url_prefixe = ($row_code_client['photographe'] . $row_code_client['date'] . $row_code_client['carte'] . $str_client = str_pad($client, 3, "0", STR_PAD_LEFT) . $row_code_client['magazin']);
Suis je sur la bonne voie???

Re: Boucle et mysql

Posté : 11 mars 2012, 13:05
par davidb1967
Ca progresse

le seul probleme qui me reste c'est que ca s'incremente pas dans le code QR comme ca le fait dans le code en toute lettre et chiffre.
<?php
$client = 000 ;
$row_code_client['date'] = date("dmy");
$url_prefixe = ($row_code_client['prefix'] . $row_code_client['photographe'] . $row_code_client['date'] . $row_code_client['carte'] . ($str_client = str_pad($client, 3, "0", STR_PAD_LEFT) . print "$str_client") . $row_code_client['magazin'] . $row_code_client['sufix']);



do
{

$filename="temp".session_id().".png";
QRcode::png($url_prefixe, $filename,'S',4,1);
echo '<img src="'.$filename.'" /><br>';

echo $row_code_client['photographe']; ?><?php echo $row_code_client['date']; ?><?php echo $row_code_client['carte']; ?><?php $str_client = str_pad($client, 3, "0", STR_PAD_LEFT);

print "$str_client"; ?><?php echo $row_code_client['magazin'] . '<br />';
$client++ ;
}
while($client<$row_code_client['nb_client']);
?>
je retombe donc sur le probleme rencomtré précedement

Re: Boucle et mysql

Posté : 11 mars 2012, 17:29
par sirakawa
Ca progresse

le seul probleme qui me reste c'est que ca s'incremente pas dans le code QR comme ca le fait dans le code en toute lettre et chiffre.
<?php
$client = 000 ;
$row_code_client['date'] = date("dmy");
$url_prefixe = ($row_code_client['prefix'] . $row_code_client['photographe'] . $row_code_client['date'] . $row_code_client['carte'] . ($str_client = str_pad($client, 3, "0", STR_PAD_LEFT) . print "$str_client") . $row_code_client['magazin'] . $row_code_client['sufix']);



do
{

$filename="temp".session_id().".png";
QRcode::png($url_prefixe, $filename,'S',4,1);
echo '<img src="'.$filename.'" /><br>';

echo $row_code_client['photographe']; ?><?php echo $row_code_client['date']; ?><?php echo $row_code_client['carte']; ?><?php $str_client = str_pad($client, 3, "0", STR_PAD_LEFT);

print "$str_client"; ?><?php echo $row_code_client['magazin'] . '<br />';
$client++ ;
}
while($client<$row_code_client['nb_client']);
?>
Plusieurs remarques :
1) On se crirait à un concours de obfuscated code:
le début me semble plus clair ainsi:
<?php
$num_client = 000 ;
$row_code_client['date'] = date("dmy");
$row_code_client['prefix'] = "prefixe";
$row_code_client['photographe'] = "photographe";
$row_code_client['carte'] = "carte";
$row_code_client['magazin'] = "magasin";
$row_code_client['suffix'] = "suffixe";
$prefixe = $row_code_client['prefix'];
$photographe = $row_code_client['photographe'] ;
$la_date = $row_code_client['date'] ;
$carte = $row_code_client['carte'] ;
$magazin = $row_code_client['magazin']; 
$str_client = str_pad($num_client, 3, "0", STR_PAD_LEFT);
$suffixe =  $row_code_client['suffix'];
 $url_prefixe =  $prefixe.$photographe.$la_date.$carte.$str_client.$magazin.$suffixe;

print"<br> $url_prefixe";
?>
1a) magazin n'existe pas en français: magasin pour le lieu, magazine pour la revue
prefix se dit prefixe en français et sufix se dit en anglais suffix et suffixe en français
2) do
while; s'exécutera au moins une fois
2a) cette succession de <?php echo?> est-elle utile? Elle a, en tous les cas le mérite de compliquer les tests...