在MYSQL查询之前使用PHP变量

时间:2015-07-13 11:45:57

标签: php mysql fpdf

!!请向下滚动到“编辑4”!!

这让我绝对疯狂!!

我有以下代码,但它不起作用:

$importsectie = join("','",$importsectie);

$query1 = "SELECT * FROM smoelenboek WHERE sectie1 IN ('$importsectie') OR sectie2 IN ('$importsectie') OR sectie3 IN ('$importsectie') OR sectie4 IN ('$importsectie') OR sectie5 IN ('$importsectie') AND actief='ja' ORDER BY achternaam ASC";

$result1 = mysql_query($query1) or die(mysql_error());
while($row1 = mysql_fetch_array($result1)){

here the stuff I want to do with the results

}

当我echo $importsectie;时,我得到Tekenen','Wiskunde,这很好。

当我echo $query1;时,我得到SELECT * FROM smoelenboek WHERE sectie1 IN ('Tekenen','Wiskunde') OR sectie2 IN ('Tekenen','Wiskunde') OR sectie3 IN ('Tekenen','Wiskunde') OR sectie4 IN ('Tekenen','Wiskunde') OR sectie5 IN ('Tekenen','Wiskunde') AND actief='ja' ORDER BY achternaam ASC我在PhpMyAdmin中尝试过的,它给了我想要的记录,所以这也很好。

我怀疑它与$importsectie有关,所以我试了一下:

$importsectie = join("','",$importsectie);

$query1 = "SELECT * FROM smoelenboek WHERE sectie1 IN ('$importsectie') OR sectie2 IN ('$importsectie') OR sectie3 IN ('$importsectie') OR sectie4 IN ('$importsectie') OR sectie5 IN ('$importsectie') AND actief='ja' ORDER BY achternaam ASC";

$query2 = "SELECT * FROM smoelenboek WHERE sectie1 IN ('Tekenen','Wiskunde') OR sectie2 IN ('Tekenen','Wiskunde') OR sectie3 IN ('Tekenen','Wiskunde') OR sectie4 IN ('Tekenen','Wiskunde') OR sectie5 IN ('Tekenen','Wiskunde') AND actief='ja' ORDER BY achternaam ASC";

$result1 = mysql_query($query2) or die(mysql_error());
while($row1 = mysql_fetch_array($result1)){

here the stuff I want to do with the results

}

echo $query1;echo $query2;现在给出完全相同的结果(与上面相同的结果),但脚本仍无效。

现在这里有一个奇怪的事情:当我在$importsectie之前意外地添加一些斜线时,它突然起作用了!

//$importsectie = join("','",$importsectie);

$query1 = "SELECT * FROM smoelenboek WHERE sectie1 IN ('$importsectie') OR sectie2 IN ('$importsectie') OR sectie3 IN ('$importsectie') OR sectie4 IN ('$importsectie') OR sectie5 IN ('$importsectie') AND actief='ja' ORDER BY achternaam ASC";

$query2 = "SELECT * FROM smoelenboek WHERE sectie1 IN ('Tekenen','Wiskunde') OR sectie2 IN ('Tekenen','Wiskunde') OR sectie3 IN ('Tekenen','Wiskunde') OR sectie4 IN ('Tekenen','Wiskunde') OR sectie5 IN ('Tekenen','Wiskunde') AND actief='ja' ORDER BY achternaam ASC";

$result1 = mysql_query($query2) or die(mysql_error());
while($row1 = mysql_fetch_array($result1)){

here the stuff I want to do with the results

}

为什么?!?我真的想使用$importsectie中的信息。 我想用它做的事情就是用FPDF制作一个pdf文件。 $importsectie未在代码中的任何其他位置使用。

修改

我以不同的方式尝试过:

 $importsectie = $importsectie[0];

 $query1 = "SELECT * FROM smoelenboek WHERE sectie1='$importsectie' OR sectie2='$importsectie' OR sectie3='$importsectie' OR sectie4='$importsectie' OR sectie5='$importsectie' AND actief='ja' ORDER BY achternaam ASC";

 $query2 = "SELECT * FROM smoelenboek WHERE sectie1='Tekenen' OR sectie2='Tekenen' OR sectie3='Tekenen' OR sectie4='Tekenen' OR sectie5='Tekenen' AND actief='ja' ORDER BY achternaam ASC";

 $result1 = mysql_query($query1) or die(mysql_error());
 while($row1 = mysql_fetch_array($result1)){

 here the stuff I want to do with the results

 }

echo $query1;echo $query2;都会再次给出相同的结果。 现在使用$query2可以正常工作(所以$importsectie之前没有斜线)。 使用$query1将开始加载pdf,加载图片填满,然后显示“无法加载PDF文件”。

编辑2

 $aantalsecties = count($importsectie);
 for($i=0;$i<=$aantalsecties-1;$i++){

     $importsectiedeel = $importsectie[$i];

     $query1 = "SELECT * FROM smoelenboek WHERE sectie1='$importsectiedeel' OR sectie2='$importsectiedeel' OR sectie3='$importsectiedeel' OR sectie4='$importsectiedeel' OR sectie5='$importsectiedeel' AND actief='ja' ORDER BY achternaam ASC";

     $query2 = "SELECT * FROM bonasmoelenboek WHERE sectie1='Tekenen' OR sectie2='Tekenen' OR sectie3='Tekenen' OR sectie4='Tekenen' OR sectie5='Tekenen' AND actief='ja' ORDER BY achternaam ASC";

     $result1 = mysql_query($query1) or die(mysql_error());
     while($row1 = mysql_fetch_array($result1)){

         here the stuff I want to do with the results

     }
 }

echo $query1;echo $query2;都会给出与之前相同的结果。现在他们都将开始加载pdf,但加载图片没有填满,页面保持“正在加载...”。在if语句中构建$query1时,我遇到了同样的问题。

编辑3

所以我按照建议多次将mysqli与预备语句结合使用。由于我仍然遇到同样的问题,我现在将发布整个代码。

首先我有一个带复选框的页面:

<form action="pdfrender.php" method="POST">
    <input type="checkbox" name="sectie[]" value="Tekenen">Tekenen<br>
    <input type="checkbox" name="sectie[]" value="Wiskunde">Wiskunde<br>
    <input type="submit" value="Sectiesmoelenboek">
</form>

pdfrender.php如下:

<?php

//Informatie binnenhalen
$importsectie = $_POST['sectie']; 

//Starten met het PDF-maak-script
require('../fpdf/fpdf.php');
class PDF extends FPDF
{
    //Koptekst
    function Header()
    {
        // Logo en een stukje leeg daaronder
        $this->Image('burggravenlaanheader.jpg',0,0,210);
        $this->Ln(20);
    }

    //Voettekst
    function Footer()
    {
        //1.5 cm boven de paginarand
        $this->SetY(-15);
        $this->SetFont('Arial','I',8);
        //Een hokje van paginabreed, 1 cm hoog, daarin pagina/totaal, geen rand, centreren
        $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
    }

}


//PDF aanmaken, pagina's laten tellen, nieuwe pagina beginnen
$pdf = new PDF();
$pdf->AliasNbPages();
$pdf->AddPage();


//Teller nodig om foto's links en rechts op de pagina te plaatsen
$teller = 1;


//This is going to be dynamic later, with a for-loop scrolling through the parts of the array
$importsectiedeel = $importsectie[1];


//Informatie uit database halen
include '../dbconi.inc';


//Prepare en bind
$query1 ="SELECT * FROM smoelenboek WHERE sectie1=? OR sectie2=? OR sectie3=? OR sectie4=? OR sectie5=? AND actief='ja' ORDER BY achternaam ASC";
$stmt = $con->stmt_init();
if(!$stmt->prepare($query1)){

    print "Failed to prepare statement\n";

}else{

    $stmt->bind_param("sssss",$importsectiedeel,$importsectiedeel,$importsectiedeel,$importsectiedeel,$importsectiedeel);
    $stmt->execute();
    $result1 = $stmt->get_result();
    while ($row1 = $result1->fetch_assoc()) {

        //Alle parameters klaarmaken voor printen
        $afkorting = $row1['afkorting'];
        $voorletters = $row1['voorletters'];  
        $voornaam = $row1['voornaam'];
        $tussenvoegsel = $row1['tussenvoegsel'];
        $achternaam = $row1['achternaam'];
        $sectie1 = $row1['sectie1'];
        $sectie2 = $row1['sectie2'];
        $sectie3 = $row1['sectie3'];
        $sectie4 = $row1['sectie4'];
        $taak1 = $row1['taak1'];
        $taak1 = str_replace("?","",$taak1);
        $taak2 = $row1['taak2'];
        $taak2 = str_replace("?","",$taak2);
        $taak3 = $row1['taak3'];
        $taak3 = str_replace("?","",$taak3);
        $taak4 = $row1['taak4'];
        $taak4 = str_replace("?","",$taak4);
        $taak5 = $row1['taak5'];
        $taak5 = str_replace("?","",$taak5);

         //Alle secties en taken onder elkaar zetten
        $onderelkaar = $sectie1."\n".$sectie2."\n".$sectie3."\n".$sectie4."\n".$taak1."\n".$taak2."\n".$taak3."\n".$taak4."\n".$taak5;

        //Zorgen dat minder dan 4 secties en minder dan 5 taken geen extra witregels oplevert
        $onderelkaar = str_replace("\n\n","\n",$onderelkaar);
        $onderelkaar = str_replace("\n\n","\n",$onderelkaar);
        $onderelkaar = str_replace("\n\n","\n",$onderelkaar);
        $onderelkaar = str_replace("\n\n","\n",$onderelkaar);

        //Fotolink klaarzetten indien aanwezig, anders geenfoto.jpg klaarzetten
        if (file_exists('fotos/'.$afkorting.'.jpg')){

            $foto = 'fotos/'.$afkorting.'.jpg';

        }else{

            $foto = 'fotos/geenfoto.jpg';

        }

        //Afkorting hoofdletters voor het afdrukken (was klein voor het aanroepen van de jpg)
        $afkorting = strtoupper($afkorting);

        //Naam en afkorting koppelen
        $titel = $voorletters.' ('.$voornaam.') '.$tussenvoegsel.' '.$achternaam.' ('.$afkorting.')';

        //Extra spaties verwijderen bij mensen zonder tussenvoegsel
        $titel = str_replace("  "," ",$titel);

        //Als de teller oneven is, persoon links plaatsen
        if($teller%2!=0){

            $pdf->SetFont('Arial','',12);
            $pdf->Cell(95,7,$titel,0,1);
            $y = $pdf->GetY();
            $x = $pdf->GetX();
            $pdf->SetFont('Arial','',10);
            $pdf->Cell(30,45,$pdf->Image($foto,$pdf->GetX(),$pdf->GetY(),30),1,0);
            $pdf->MultiCell(65,5,$onderelkaar,0);

        //Als de teller even is, de persoon rechts plaatsen    
        }else{

            $pdf->SetY($y-7);
            $pdf->SetX($x+95);
            $pdf->SetFont('Arial','',12);
            $pdf->Cell(95,7,$titel,0,0);
            $pdf->SetY($y);
            $pdf->SetX($x+95);
            $pdf->Cell(30,45,$pdf->Image($foto,$pdf->GetX(),$pdf->GetY(),30),1,0);
            $pdf->SetY($y);
            $pdf->SetX($x+125);
            $pdf->SetFont('Arial','',10);
            $pdf->MultiCell(65,5,$onderelkaar,0);
            $pdf->SetY($y+45);
            $pdf->SetX(10);
            $pdf->Cell(0,9,'',0,2);

        }

        //Teller laten oplopen
        $teller = $teller+1;    

    //Afsluiten van de while-loop
    }

//Afsluiten van de else
}

//Als de laatste persoon links geplaatst is, cursor naar beneden zetten (ipv ernaast)
if($teller%2==0){

    $pdf->SetY($y+45);
    $pdf->SetX(10);
    $pdf->Cell(0,9,'',0,2);

}

//PDF daadwerkelijk aanmaken
$pdf->Output();

//Statement en databaseconnectie sluiten
$stmt->close();
$con->close();

?>

当我用?替换五个'Tekenen'并删除bind_param时,正确呈现了pdf。当我使用上面的代码时,它没有。该页面保持“正在加载...”。我在每个变量的代码中使用了var_dump。在两种情况下我都得到相同的输出(工作和不工作)。谁能帮忙???

编辑4

我将其缩小到以下行(在代码中出现两次。):

$pdf->Cell(30,45,$pdf->Image($foto,$pdf->GetX(),$pdf->GetY(),30),1,0);

更具体地说,这有效:

echo '<img src="fotos/geenfoto.jpg" width=100>';

这不是:

$pdf->Image("fotos/geenfoto.jpg",0,0,30);

如前所述,它在de MySql(i)查询中不使用变量的情况下工作,有什么不对?

2 个答案:

答案 0 :(得分:0)

除了不使用mysql_ *函数的所有流行建议外,
你需要确保你的数组元素中没有任何空格。

这里有一些示例代码,用于在每一步中删除和调试查询。

<?php

$elements = array('  element A', "\t Element B \r\n");

var_dump($elements);

/*
use var_dump to check your array elements for whitespace and such
array(2) {
  [0]=>
  string(11) "  element A"
  [1]=>
  string(14) "   Element B
"
}
*/

// create your IN clause string and verify it
$joinedString = "('" . join("','",array_map('trim',$elements)) . "')";

var_dump($joinedString);
/*
use var_dump not echo
string(25) "('element A','Element B')"

*/

// your query string finally becomes
$query = "SELECT * FROM smoelenboek 
WHERE sectie1 IN $joinedString 
OR sectie2 IN $joinedString 
OR sectie3 IN $joinedString 
OR sectie4 IN $joinedString 
OR sectie5 IN $joinedString 
AND actief='ja' ORDER BY achternaam ASC";

// and check it with var_dump and also run it in PhpMyAdmin
var_dump($query);
/*
string(280) "SELECT * FROM smoelenboek
WHERE sectie1 IN ('element A','Element B')
OR sectie2 IN ('element A','Element B')
OR sectie3 IN ('element A','Element B')
OR sectie4 IN ('element A','Element B')
OR sectie5 IN ('element A','Element B')
AND actief='ja' ORDER BY achternaam ASC"
*/

答案 1 :(得分:0)

除了仍然有效的Alex Andrei评论之外,我强烈建议使用预准备语句而不是纯SQL查询。 这是一篇关于使用MySQL预处理语句和数组参数做什么(而不是做)的相关文章: mysqli bind_param for array of strings

预备语句提供“免费”更可靠,更安全的动态参数绑定,这是您想要的,也是更好的性能,特别是对于重复查询,因为预处理语句由数据库引擎(预)编译,并且更有效执行。