Пожалуйста, прокрутите вниз до «Редактировать 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
. Материал, который я хочу сделать с ним, – это сделать PDF-файл с FPDF. $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-файл не может быть загружен».
$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-statement.
Поэтому я несколько раз переключился на 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
по всему коду для каждой переменной. Я получаю одинаковый результат в обоих случаях (работает и не работает). Может кто-нибудь помочь ???
Я сузил его до следующей строки (появляется два раза в коде):
$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);
Как было сказано ранее, он работает без использования переменных в запросе MySql (i), что может быть неправильным?
Помимо общедоступной рекомендации по использованию функций 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" */
Помимо комментария Alex Andrei, который все еще действителен, я настоятельно рекомендую использовать подготовленный оператор вместо простого SQL-запроса. Это связанная статья о том, что делать (и не делать) с подготовленными операциями MySQL и параметрами массива: mysqli bind_param для массива строк
Подготовленные заявления предлагают «бесплатно» более надежную и безопасную привязку динамических параметров, что и вы хотите, а также лучшие характеристики, особенно с повторяющимися запросами, поскольку подготовленные операторы (предварительно) скомпилированы механизмом базы данных и гораздо эффективнее выполнять.