[PHP / MySQL] Générer des étiquettes ?

Eléphanteau du PHP | 37 Messages

18 avr. 2007, 14:17

Bonjour,

Je souhaite à partir d'une base de données générer des étiquettes pour les imprimer sur du papier étiquette avec des dimensions bien particuliéres.

Connaissez vous un moyen d'arriver à cela ?

Merci d'avance

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

18 avr. 2007, 15:18

Bonjour,

La seule solution à mon avis est de générer un PDF, car ce sera le seul format à pouvoir conserver des dimensions précises pour une impression...

Regarde du côté de FPDF: http://www.fpdf.org
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 37 Messages

18 avr. 2007, 15:22

Merci pour la réponse je test cela de suite merki :)

Eléphanteau du PHP | 37 Messages

18 avr. 2007, 16:03

Plop re donc je viens de tester en effet ca pourrait pas mal correspondre car je v pouvoir faire un quadrillage trés précis et c'est ce qu'il me faut.

Aurait tu un petit tuto ou exemple comment intégrer du code PhP du genre je veux qu'il m'affiche une données venant d'une requête SQL, d'habitude j aurais mis :
<?php echo $row_req_recupatordo['ordo_num']; ?>
Mais la j'ai essayé je vois po trop le truc ?

Voila ce que j'ai essayé :
$pdf->Cell(10,10,'<?php echo $row_req_recupatordo['ordo_num']; ?>',1);

Eléphanteau du PHP | 37 Messages

18 avr. 2007, 16:58

Je suis de retour avec un peu plus de code :
<?php
//Connect to your database
include("Connections/connec_pharma.php");

//Create new pdf file
$pdf=new FPDF();

//Open file
$pdf->Open();

//Disable automatic page break
$pdf->SetAutoPageBreak(true);

//Add first page
$pdf->AddPage();

//set initial y axis position per page
$y_axis_initial = 25;

//print column titles for the actual page
$pdf->SetFillColor(232,232,232);
$pdf->SetFont('Arial','B',12);
$pdf->SetY($y_axis_initial);
$pdf->SetX(25);
$pdf->Cell(30,6,'IDPAT',1,0,'L',1);
$pdf->Cell(100,6,'ORDONUM',1,0,'L',1);

$y_axis = $y_axis + $row_height;

//Select the Products you want to show in your PDF file
$result=mysql_query('SELECT idpat, ordo_num FROM ordonnance ORDER BY idpat',$link);

//initialize counter
$i = 0;

//Set maximum rows per page
$max = 25;

//Set Row Height
$row_height = 6;

while($row = mysql_fetch_array($result))
{
    //If the current row is the last one, create new page and print column title
    if ($i == $max)
    {
        $pdf->AddPage();

        //print column titles for the current page
        $pdf->SetY($y_axis_initial);
        $pdf->SetX(25);
        $pdf->Cell(30,6,'IDPAT',1,0,'L',1);
        $pdf->Cell(100,6,'ORDONUM',1,0,'L',1);
		
        //Go to next row
        $y_axis = $y_axis + $row_height;
        
        //Set $i variable to 0 (first row)
        $i = 0;
    }

    $idpat = $row['idpat'];
    $ordonum = $row['ordo_num'];


    $pdf->SetY($y_axis);
    $pdf->SetX(25);
    $pdf->Cell(30,6,$idpat,1,0,'L',1);
    $pdf->Cell(100,6,$ordo_num,1,0,'L',1);

    //Go to next row
    $y_axis = $y_axis + $row_height;
    $i = $i + 1;
}

mysql_close($link);

//Create file
$pdf->Output();
?>
Le script n'est pas de moi j'ai juste essayé de l'adapter.

Ca me semblait pas mal mais j'ai plusieurs erreurs :

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in c:\program files\easyphp1-7\www\pharmacie\test6.php on line 40
$result=mysql_query('SELECT idpat, ordo_num FROM ordonnance ORDER BY idpat',$link);
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-7\www\pharmacie\test6.php on line 51
while($row = mysql_fetch_array($result))
Warning: mysql_close(): supplied argument is not a valid MySQL-Link resource in c:\program files\easyphp1-7\www\pharmacie\test6.php on line 85

mysql_close($link);
Et enfin :

FPDF error: Some data has already been output, can't send PDF file

Donc j'ai essayé d'enlever le $Link ca me corrige bien les 2 premiéres erreurs mais je me dit que ca doit pas être la par hazrd.

Pour les autres erreurs je vois pas trop.

Merci par avance pour l'aide que vous pourrez m'apporter :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 avr. 2007, 17:12

Jette un coup d'oeil à la doc de la fonction mysql_query(), tu verras que le deuxième argument correspond à une connexion mysql ouverte et est optionnel s'il n'y en a qu'une...

Tout dépend donc de la façon dont tu te connectes à ta base dans connec_pharma.php, mais à priori, si tu n'utilises pas l'identifiant de la connexion, tu peux dégager le $link partout et virer également la fermeture mysql_close($link) (celle-ci s'effectuera de toute façon une fois le script exécuté :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 37 Messages

19 avr. 2007, 09:57

Bonjour,

Donc merci pour le lien sur la DOC (Dans mes Bookmarks maintenant :p), en effet il me suffisait de l'enlever.

J'avais ensuite un petit probléme avec le array, j'ai regardé la doc correspondante et j'ai remanié quelque peu le code car j'avais un probléme de requête (Base non séléctionné) :
$result=mysql_query("SELECT idpat,ordo_num FROM ordonnance GROUP BY ordo_num");
mysql_select_db('pharmacie') or die(mysql_error());
$resultfin = mysql_query($result);
Voila ca marche beaucoup mieux maintenant à part qu'il à tendance a me ressortir l'erreur array mais avec un petit rafraichissement, mon PDF s'ouvre. Bizard non ?

Eléphanteau du PHP | 37 Messages

19 avr. 2007, 12:25

Re-Bonjour :)

Donc aprés pas mal de tests, je pense avoir un bon début :)

Je me suis appuyé sur le script de "Carlos Vásquez Sáez Exemple avec MySQL" que j'ai légérement modifié pour le faire coller à ma base.

Ma premiére contrainte était de devoir mettre 2 champs (nompatient & ordo_num) dans la même cellule.

Pour cela, sachant qu'une étiquette sur ma planche fait 70 mm de Large pour 35 mm de haut.

J'ai divisé cela par 2 pour donner 35 et 17,5 à chaque une de mes 2 cellules.

Puis avec Ln(17,5) Je fait un saut de ligne qui fait que ma cellule ce met juste en dessous de la premiére (e ajustant le SetX) et me donne donc une cellule de 70 mm.

Donc jusque la c'est pas mal seul souci mon affichage ce passe bien mais il ce fait sur une colonne mais ma planche à étiquette permet de mettre 3 colonnes, mon but et de faire en sorte que la premiére "double cellule" de mon 1ier enregistrement soit mis en haut à gauche puis le 2ieme enregistrement juste à ca doite, le 3 iéme encore à droite Pis un saut de ligne et on recommence...

Données complémentaires :
1 cellule de la planche =70mm - 35mm
1 Planche = 3 colonnes de 8 étiquettes (cellule).

Voici le code :
<?php

define('FPDF_FONTPATH','font/');
require('fpdf.php');

//Connect to your database
include("connec_pharma.php");

//Create new pdf file
$pdf=new FPDF('P','mm','A4');

//Open file
$pdf->Open();

//Disable automatic page break
$pdf->SetAutoPageBreak(false);

//Add first page
$pdf->AddPage();

//set initial y axis position per page
$y_axis_initial = 8;

$y_axis = 8;

//Select the Products you want to show in your PDF file
//$result=mysql_query("SELECT idpat,ordo_num FROM ordonnance GROUP BY ordo_num");
$result=mysql_query("SELECT nompatient,ordo_num FROM patient AS p, ordonnance AS o WHERE p.numpatient = o.idpat GROUP BY ordo_num");
mysql_select_db('pharmacie') or die(mysql_error());
$resultfin = mysql_query($result);

//initialize counter
$i = 0;

//Set maximum rows per page
$max = 8;

//Set Row Height
$row_height = 35;

while($row = mysql_fetch_array($result))
{
    //If the current row is the last one, create new page and print column title
    if ($i == $max)
    {
        $pdf->AddPage();
		$nompat = $row['nompatient'];
    	$ordonum = $row['ordo_num'];
		$pdf->SetFillColor(232,232,232);
    	$pdf->SetFont('Arial','B',12);
    	$pdf->SetY($y_axis_initial);
    	$pdf->SetX(8);
    	$pdf->Cell(70,17.5,$nompat,1,0,'C',1);
		$pdf->Ln(17.5);
		$pdf->SetX(8);
		$pdf->Cell(70,17.5,$ordonum,1,0,'C',1);
		
        //Go to next row
        $y_axis = $y_axis + $row_height;
        
        //Set $i variable to 0 (first row)
        $i = 0;
    }

    $nompat = $row['nompatient'];
    $ordonum = $row['ordo_num'];
	$pdf->SetFillColor(232,232,232);
    $pdf->SetFont('Arial','B',12);
    $pdf->SetY($y_axis);
    $pdf->SetX(8);
    $pdf->Cell(70,17.5,$nompat,1,0,'C',1);
	$pdf->Ln(17.5);
	$pdf->SetX(8);
	$pdf->Cell(70,17.5,$ordonum,1,0,'C',1);

    //Go to next row
    $y_axis = $y_axis + $row_height;
    $i = $i + 1;
}

//Create file
$pdf->Output();
?>
Je pense qu'il faudrait que je passe par un nouveau compteur pour le nombre de colonne quant on arrive à 3 je fait un Saut de ligne (Ln) et surement n autre compteur qui permettrait d'ajuster mon SetX (position de la cellule sur l'axe X) dans un Jolie SI Imbriqué.

Mais j'avouerai que mes compétences en PHP me permette pas de bien voir le truc, je continue à chercher en attendant votre aide si précieuse :)
Merci d'avance !

Eléphanteau du PHP | 37 Messages

19 avr. 2007, 17:18

Alors je continu à bosser sur mes satané étiquette et j ai un nouveau début de résultat.

Donc en gros je pense que c'est bien ca, je dois me débrouiller avec des compteurs et des IF.

Voici mon dernier résultat qui me remplit bien toute mes cases comme il faut mais seul hic qui est d'ailleurs trés logiques (vous allez voir dans le code), mon premier patient ce répéte 3 fois sur la premiére ligne, le deuxiéme patient ce répéte 3 fois sur la deuxiéme ligne .....

Voici le code :
<?php

define('FPDF_FONTPATH','font/');
require('fpdf.php');

//Connect to your database
include("connec_pharma.php");

//Create new pdf file
$pdf=new FPDF('P','mm','A4');

//Open file
$pdf->Open();

//Disable automatic page break
$pdf->SetAutoPageBreak(false);

//Add first page
$pdf->AddPage();

//set initial y axis position per page
$y_axis_initial = 8;

$y_axis = 8;

//Select the Products you want to show in your PDF file
//$result=mysql_query("SELECT idpat,ordo_num FROM ordonnance GROUP BY ordo_num");
$result=mysql_query("SELECT nompatient,ordo_num FROM patient AS p, ordonnance AS o WHERE p.numpatient = o.idpat GROUP BY ordo_num");
mysql_select_db('pharmacie') or die(mysql_error());
$resultfin = mysql_query($result);

//initialize counter ligne
$i = 0;
//initialize counter cols
$cptcol = 0;

//Set maximum rows per page
$max = 8;
//Set maximim cols per page
$maxcol = 3;

//Set Row Height
$row_height = 35;
//Set Cols Width
$cols_width = 70;

while($row = mysql_fetch_array($result))
{
    //If the current row is the last one, create new page and print column title
    if ($i == $max)
    {	
        $pdf->AddPage();
		$nompat = $row['nompatient'];
    	$ordonum = $row['ordo_num'];
		$pdf->SetFillColor(232,232,232);
    	$pdf->SetFont('Arial','B',12);
    	$pdf->SetY($y_axis_initial);
    	$pdf->SetX(8);
    	$pdf->Cell(70,17.5,$nompat,1,0,'C',1);
		$pdf->Ln(17.5);
		$pdf->SetX(8);
		$pdf->Cell(70,17.5,$ordonum,1,0,'C',1);
		
        //Go to next row
        $y_axis = $y_axis + $row_height;
        
        //Set $i variable to 0 (first row)
        $i = 0;
    }
	if ($cptcol == 0)
		{
    $nompat = $row['nompatient'];
    $ordonum = $row['ordo_num'];
	$pdf->SetFillColor(232,232,232);
    $pdf->SetFont('Arial','B',12);
    $pdf->SetY($y_axis);
    $pdf->SetX(8);
    $pdf->Cell(70,17.5,$nompat,1,0,'C',1);
	$pdf->Ln(17.5);
	$pdf->SetX(8);
	$pdf->Cell(70,17.5,$ordonum,1,0,'C',1);

    //Go to next row
	$cptcol = $cptcol + 1;
	}
	if ($cptcol == 1)
	{
	    $nompat = $row['nompatient'];
    $ordonum = $row['ordo_num'];
	$pdf->SetFillColor(232,232,232);
    $pdf->SetFont('Arial','B',12);
    $pdf->SetY($y_axis);
    $pdf->SetX(78);
    $pdf->Cell(70,17.5,$nompat,1,0,'C',1);
	$pdf->Ln(17.5);
	$pdf->SetX(78);
	$pdf->Cell(70,17.5,$ordonum,1,0,'C',1);

    //Go to next row
	$cptcol = $cptcol + 1;
	}
	if ($cptcol == 2)
	{
	$nompat = $row['nompatient'];
    $ordonum = $row['ordo_num'];
	$pdf->SetFillColor(232,232,232);
    $pdf->SetFont('Arial','B',12);
    $pdf->SetY($y_axis);
    $pdf->SetX(148);
    $pdf->Cell(70,17.5,$nompat,1,0,'C',1);
	$pdf->Ln(17.5);
	$pdf->SetX(148);
	$pdf->Cell(70,17.5,$ordonum,1,0,'C',1);
	    //Go to next row
    $y_axis = $y_axis + $row_height;
    $i = $i + 1;
	$cptcol = 0;
	}
}

//Create file
$pdf->Output();
?>
Encore une fois je suis conscient que le résultat affiché (la redondance est logique) mais j'essaye depuis 3 Hrs de modifier cela sans la redondance mais j'y arrive pas.

Ma logique (ca doit pas être logique) :

J'incrémente à la base un compteur $cptcol avec 0

SI $cptcol = à 0 alors on traite le SetX() normalement soit avec 8 (ce qui veux dire à 80 mm de la page)
la variable $cptcol prend +1
SI $cptcol = 1 alors la variable $cols_width prend 70
on traite le SetX() avec 8 + $cols_width
Si $cptcol = 2 alors la variable $cols_width prend 140
on traite le SetX() avec 8 + $cols_width
Si $cptcol = 3 on saute la ligne
$cptcol prend 0 et on recommence....

Voila en français je pense que c'est viable mais en PHP j'arrive pas à le transcrire et bien placer dans mon code.

Voici tout de même le code de mon essai :
<?php
//PDF USING MULTIPLE PAGES
//FILE CREATED BY: Carlos José Vásquez Sáez
//YOU CAN CONTACT ME: [email protected]
//FROM PUNTA ARENAS, MAGALLANES
//INOVO GROUP - http://www.inovo.cl

define('FPDF_FONTPATH','font/');
require('fpdf.php');

//Connect to your database
include("connec_pharma.php");

//Create new pdf file
$pdf=new FPDF('P','mm','A4');

//Open file
$pdf->Open();

//Disable automatic page break
$pdf->SetAutoPageBreak(false);

//Add first page
$pdf->AddPage();

//set initial y axis position per page
$y_axis_initial = 8;

$y_axis = 8;

//Select the Products you want to show in your PDF file
//$result=mysql_query("SELECT idpat,ordo_num FROM ordonnance GROUP BY ordo_num");
$result=mysql_query("SELECT nompatient,ordo_num FROM patient AS p, ordonnance AS o WHERE p.numpatient = o.idpat GROUP BY ordo_num");
mysql_select_db('pharmacie') or die(mysql_error());
$resultfin = mysql_query($result);

//initialize counter ligne
$i = 0;
//initialize counter cols
$cptcol = 0;

//Set maximum rows per page
$max = 8;
//Set maximim cols per page
$maxcol = 3;

//Set Row Height
$row_height = 35;
//Set Cols Width
$cols_width = 0;

while($row = mysql_fetch_array($result))
{
    //If the current row is the last one, create new page and print column title
    if ($i == $max)
    {	
        $pdf->AddPage();
		$nompat = $row['nompatient'];
    	$ordonum = $row['ordo_num'];
		$pdf->SetFillColor(232,232,232);
    	$pdf->SetFont('Arial','B',12);
    	$pdf->SetY($y_axis_initial);
    	$pdf->SetX(8);
    	$pdf->Cell(70,17.5,$nompat,1,0,'C',1);
		$pdf->Ln(17.5);
		$pdf->SetX(8);
		$pdf->Cell(70,17.5,$ordonum,1,0,'C',1);
		
        //Go to next row
        $y_axis = $y_axis + $row_height;
        
        //Set $i variable to 0 (first row)
        $i = 0;
    }
	if (cptcol == 1)
	{
	$cols_width = 70;
	$cptcol = $cptcol + 1;
	}
	if (cptcol == 2)
	{
	$cols_width = 140;
	$cptcol = $cptcol + 1;
	}
	$cols_width = 1;
	$nompat = $row['nompatient'];
    $ordonum = $row['ordo_num'];
	$pdf->SetFillColor(232,232,232);
    $pdf->SetFont('Arial','B',12);
    $pdf->SetY($y_axis);
    $pdf->SetX(8 + $cols_width);
    $pdf->Cell(70,17.5,$nompat,1,0,'C',1);
	$pdf->Ln(17.5);
	$pdf->SetX(8 + $cols_width);
	$pdf->Cell(70,17.5,$ordonum,1,0,'C',1);
	    //Go to next row
    $y_axis = $y_axis + $row_height;
    $i = $i + 1;
}

//Create file
$pdf->Output();
?>
VOili Voilou je need à mort un petit coup de pouce sur cela je vous en serez trés reconnaissant. Merci d'avance.

Eléphanteau du PHP | 37 Messages

20 avr. 2007, 09:10

Personne à une petite idée ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

20 avr. 2007, 10:02

Bonjour,

Essaye ceci:
 if ($cptcol == 1)
    {
        $row = mysql_fetch_array($result);
        $nompat = $row['nompatient']; 
// [...]
 if ($cptcol == 2)
    {
        $row = mysql_fetch_array($result);
        $nompat = $row['nompatient']; 
le fait de rappeler mysql_fetch_array() permet de récupérer le résultat suivant.
Toutefois, tu va avoir un message d'erreur éventuellement pour les dernière et avant-dernière cases si ton résultat n'est pas un multiple de 3.
Dans ce cas, il te suffit de faire un test pour être sûr d'avoir qqch à afficher...
Quand tout le reste a échoué, lisez le mode d'emploi...