2015-08-05 2 views
0

Я пытаюсь получить PDF-документ с PHP. До сих пор она работает нормально, но сейчас я борюсь в данный момент:Попытка понять TCPDF

while($row = mysqli_fetch_array($result)) 
    { 
    $nombre_plato =""; 
    $nombre_plato .= " ".recuperar_nombre_plato($row['plato_pedido']).""; 

    $pdf->writeHTML($nombre_plato, true, 0, true, 0); 
} 

recuperar_nombre_plato ($ переменная) является функция, которая вызывается из другого файла.

Если я пишу:

$nombre_plato .= " ".$row['plato_pedido'].""; 

Затем, на выходе будет, как и ожидалось ($ строки [ 'plato_pedido'] = 1), есть 4 строки:

enter image description here

но с использованием желаемый код

$nombre_plato .= " ".recuperar_nombre_plato($row['plato_pedido']).""; 

выход - пустое пространство, без выхода. Функция отлично работает на других файлах. Строка вывода отображается в других файлах, но не здесь.

Любая помощь приветствуется ...

EDIT:

function recuperar_nombre_plato ($recibido) { 

/*** mysql hostname ***/ 
$hostname = 'XXX'; 

/*** mysql username ***/ 
$username = 'XXX'; 

/*** mysql password ***/ 
$password = 'XXX'; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=XXX", $username, $password); 
    /*** echo a message saying we have connected ***/ 



    $sql = "SELECT * FROM tb_platos WHERE id_plato = '".$recibido."'"; 
    foreach ($dbh->query($sql) as $row) 
     { 
     return $row['nombre_plato']; 
     } 


    $dbh = null; 
} 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
    } 


} 

ПОЛНЫЙ ИСХОДНЫЙ КОД:

<?php session_start(); 
include "funciones.php"; 
include "definiciones.php"; 
require_once('tcpdf/config/lang/eng.php'); 
require_once('tcpdf/tcpdf.php'); 
// create new PDF document 
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 
// set document information 
$pdf->SetCreator(PDF_CREATOR); 
$pdf->SetAuthor('Dario Balas'); 
$pdf->SetTitle('PDF'); 
$pdf->SetSubject('PDF'); 
$pdf->SetKeywords('PDF'); 
// set default monospaced font 
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); 
//set margins 
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); 
//set auto page breaks 
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); 
//set image scale factor 
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 
//set some language-dependent strings 
$pdf->setLanguageArray($l); 
// --------------------------------------------------------- 
// set default font subsetting mode 
$pdf->setFontSubsetting(true); 
// Set font 
// dejavusans is a UTF-8 Unicode font, if you only need to 
// print standard ASCII chars, you can use core fonts like 
// helvetica or times to reduce file size. 
$pdf->SetFont('helvetica', 'B', 12); 
// Add a page 
// This method has several options, check the source code documentation for more information. 
$pdf->AddPage(); 
// Set some content to print 

$pdf->Image('imagenes/logo_restaurante.gif',20, 20, 20, 25, '', '', 'T', false, 72, '', false, false, 1, false, false, false); 

$pdf->SetXY(20, 42); 
$pdf->writeHTML($nombre_restaurante,'<br>'); 
$pdf->SetXY(20, 47); 
$pdf->writeHTML($direccion_restaurante,'<br>'); 
$pdf->SetXY(20, 52); 
$pdf->writeHTML($ciudad_restaurante,'<br>'); 
$pdf->SetXY(130, 12); 
$pdf->writeHTML("Orden ".$_SESSION['pedido'],'<br>'); 
$pdf->SetFont('helvetica', 'B', 12); 
$pdf->SetXY(130, 17); 
$pdf->writeHTML("Fecha/Hora inicio: ",'<br>'); 
$pdf->SetFont('helvetica', '', 12); 
$pdf->SetXY(130, 22); 
$pdf->writeHTML(recuperar_fecha_pedido($_SESSION['pedido']),'<br>'); 
$pdf->SetFont('helvetica', 'B', 12); 
$pdf->SetXY(130, 27); 
$pdf->writeHTML("Le atendió: ",'<br>'); 
$pdf->SetXY(130, 32); 
$pdf->SetFont('helvetica', '', 12); 
$pdf->writeHTML(recuperar_nombre_usuario(recuperar_atendio_pedido($_SESSION['pedido'])),'<br>'); 
$pdf->SetFont('helvetica', 'B', 12); 
$pdf->SetXY(130, 37); 
$pdf->writeHTML("Mesa: ",'<br>'); 
$pdf->SetFont('helvetica', '', 12); 
$pdf->SetXY(130, 42); 
$pdf->writeHTML(recuperar_nombre_mesa(recuperar_mesa_pedido($_SESSION['pedido'])),'<br>'); 
$con=mysqli_connect("localhost","XXX","XXX","XXX"); 
// Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 
    $pdf->SetXY(15, 72); 
    $x= 72; 
    $nombre_plato =""; 
$result = mysqli_query($con,"SELECT * FROM tb_lineas_comanda WHERE id_pedido = '".$_SESSION['pedido']."'"); 
while($row = mysqli_fetch_array($result)) 
    { 

    $nombre_plato .= " ".recuperar_nombre_plato($row['plato_pedido']).""; 


} 

$pdf->writeHTML($nombre_plato, true, 0, true, 0); 
// --------------------------------------------------------- 
// Close and output PDF document 
// This method has several options, check the source code documentation for more information. 
$pdf->Output('', 'I'); 
//============================================================+ 
// END OF FILE 
//============================================================+ 

?> 
+2

столб 'recuperar_nombre_plato()' функция –

+0

Как мы можем возможно диагностировать эту проблему без кода recuperar_nombre_plato? –

+0

@ Дагон, я включил функцию в свой вопрос. Спасибо – mvasco

ответ

2

Вы не можете вернуть более чем одну вещь из функции, поэтому оператор возврата в цикле не имеет смысла. Поэтому создайте временную строку в этом цикле и верните эту строку.

function recuperar_nombre_plato ($recibido) { 
    $hostname = 'XXX'; 
    $username = 'XXX'; 
    $password = 'XXX'; 

    try { 
     $dbh = new PDO("mysql:host=$hostname;dbname=XXX", $username, $password); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $sql = "SELECT * FROM tb_platos WHERE id_plato = '".$recibido."'"; 
     $str = ''; 
     foreach ($dbh->query($sql) as $row) { 
      $str .= $row['nombre_plato']; 
     } 
     return $str; 

     // nothing happens after a return so this will never get run 
     //$dbh = null; 
    } 
    catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
} 

Или, если запрос может возвращать только одну строку, потому что id_plato является уникальным ключом, то изменить код, чтобы отразить этот факт.

function recuperar_nombre_plato ($recibido) { 
    $hostname = 'XXX'; 
    $username = 'XXX'; 
    $password = 'XXX'; 

    try { 

     $dbh = new PDO("mysql:host=$hostname;dbname=XXX", $username, $password); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $sql = "SELECT * FROM tb_platos WHERE id_plato = '".$recibido."'"; 

     $stmt = $dbh->query($sql); 
     $row = $stmt->fetch(PDO::FETCH_ASSOC); 
     return $row['nombre_plato']; 

     // nothing happens after a return so this will never get run 
     //$dbh = null; 
    } 
    catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
} 

Также в основной функции, как вы строите текстовую строку из нескольких звонков в recuperar_nombre_plato() вы не хотите, чтобы переместить вызов $pdf->writeHTML вне цикла. И инициализация $nombre_plato перед циклом, как это: -

$nombre_plato =""; 
while($row = mysqli_fetch_array($result)) { 
    $nombre_plato .= " ".recuperar_nombre_plato($row['plato_pedido']); 
} 
$pdf->writeHTML($nombre_plato, true, 0, true, 0); 
+0

Спасибо RiggsFolly, я изменил свой код, как вы предлагаете. Используя ваше первое предложение, результат остается пустым. Используя второе предложение, я получаю исключение: не могу использовать объект типа PDOStatement как массив – mvasco

+0

Нет, он выдает только одну строку, но, как я сказал в своем вопросе, я использую эту функцию в других частях моего проекта и насколько это возможно Я знаю, он работает нормально, так как это ... – mvasco

+0

Rigss, вы уверены, что проблема связана с функцией? Я думаю, что он должен делать больше с тем, как работает TCPDF ... но не уверен ... Я не эксперт. – mvasco

Смежные вопросы