【问题标题】:Using a PHP variable before a MYSQL query在 MYSQL 查询之前使用 PHP 变量
【发布时间】:2015-10-01 16:00:55
【问题描述】:

!!请向下滚动到“编辑 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; 时,我得到了我在 PhpMyAdmin 中尝试过的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,它给了我想要的记录,所以这也很好。

我怀疑它与$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,但是加载图片没有填满,页面一直“加载中...”。当 $query1 在 if 语句中构建时,我遇到了同样的问题。

编辑 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) 查询中不使用变量,有什么问题?

【问题讨论】:

  • 当它“不起作用”时究竟会发生什么?
  • 页面开始制作pdf文件,但一直“加载中...”。通常,在加载图片中,一个由八个部分组成的圆圈填满,当它填满时,文件就准备好了。现在没有显示任何部分,只有文本“正在加载,...”
  • 不要使用mysql_query,使用mysqli或pdo结合prepared statements。
  • 请阅读huge red warning at the top of this page并相应地调整您的代码。
  • 好的,我知道我应该使用 mysqli 而不是 mysql。我想先让它工作,然后切换到mysqli。

标签: php mysql fpdf


【解决方案1】:

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

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

【讨论】:

  • 查看编辑 3:我切换到 mysqli 并结合准备好的语句,但它仍然无法正常工作,有什么想法吗?
  • “Still not working”表示查询没有返回您期望的结果或返回错误?在第一种情况下,如果您使用 SQL 客户端手动运行它,您必须 100% 确定带有这些参数的 SQL 查询实际上可以正常工作。如果你打开调试日志,你可能可以取回 PHP 在后台运行的 SQL 查询。
  • 查询工作正常,我检查了 PhpMyAdmin。问题似乎出在带有图像的 fpdf 中。查看更多here
【解决方案2】:

除了不使用 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"
*/

【讨论】:

  • 谢谢!这个答案很费劲!不幸的是,它并没有解决我的问题......我得到与var_dump($query1)var_dump($query2) 完全相同的输出。不过,该脚本仅适用于 $query2 并且没有 for 循环。
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
相关资源
最近更新 更多