2016-06-21 5 views
-1

Ich habe Mühe, dies zu verstehen.PDO-Abfrage kein Ergebnis in PHP aber Ergebnis in phpmyadmin oder mysql binär

Ich habe das folgende Stück Code:

$result=$db->query(" select `job_id`,`jobs`.`client` 
     from `stores` 
     left join `jobs` 
     on `jobs`.`client`=`stores`.`id` 
     where `stores`.`postcode`='BD5 8HP' 
     and `stores`.`company`='MATALAN' 
     and `jobs`.`description`='MONTHLY external - Clean Both sides of External Glazing, Frames, Ledges & Entrance Doors (up to 1.8m Height) - Including Black out windows - Removing cobwebs and dust from all areas' ")->fetch(); 
echo "info:"; 
print_r($result); 
die(); 

Die Abfrage gibt absolut nichts, auch bekannt als $ result ein leeres Array ist.

Wenn ich genau dieselbe Abfrage über PhpMyAdmin oder vom MySQL-Binär-Client (auf dem Server) ausführen, habe ich Ergebnisse.

Der PHP-Code war eine Vorbereitung -> Ausführung der Konstruktion, aber da ich ein leeres Ergebnis erhielt, versuchte ich, es (für Testzwecke) durch eine direkte Abfrage zu ersetzen.

Ich habe mir ein sehr ähnliches Thema auf SO here angesehen, das darauf hinweist, dass das Problem mit der Bindung zusammenhing, jetzt habe ich überhaupt keine Bindung in obiger Abfrage, aber das Ergebnis ist eine leere Zeichenfolge.

Andere Abfragen wie, "select * from table" führen Ergebnisse zurück, so habe ich keine Ahnung, was hier falsch sein kann.

Irgendeine Idee/Beratung bitte?

Als eine Fußnote führe ich die Abfrage gegen einen Remote-Server. Kann es etwas mit dem Zeichensatz sein?

EDIT:

Während ich Vorschlag den Wert der Beschreibung ändern erhalten, ich kann das nicht tun. Dieser Wert wird aus einer PDF ausgelesen und ein Ort kann ähnliche Werte haben, so dass die Verwendung von LIKE und% nicht wirklich für mich funktioniert. Ich muss den genauen Wert erhalten, der zusammengebracht wird.

EDIT 2 Ok, das Problem scheint ein wenig komplexer zu sein und die Ursache dafür könnte irgendwo tiefer liegen. Wenn ich die Zeichenfolge manuell in den PHP-Code schreibe, bekomme ich das korrekte Ergebnis, aber wenn ich es als Variable übergebe, scheint es nicht mehr zu funktionieren. Hier ist ein größerer Teil meines Skripts. Das Skript prüft E-Mails mit IMAP, wenn eine E-Mail mit einigen Regeln übereinstimmt und es eine Anlage hat, die den Anhang, der eine PDF ist, öffnet, in Text konvertiert, einige Bilder extrahiert und eine Datenbank entsprechend aktualisiert.

$invoicedata=$a['attachment']; 
         $descriptorspec = array(
          0 => array("pipe", "r"), // stdin is a pipe that the child will read from 
          1 => array("pipe", "w"), // stdout is a pipe that the child will write to 
          2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to 
         ); 

         $cwd = '/tmp'; 
         $process = proc_open('pdftotext - -', $descriptorspec, $pipes, $cwd); 

         if (is_resource($process)) { 

          fwrite($pipes[0], $invoicedata); 
          fclose($pipes[0]); 
          $all_text=stream_get_contents($pipes[1]); 
          fclose($pipes[1]); 

          proc_close($process); 
          preg_match("/ARL SUPPORT SERVICES (.*)/",$all_text,$extracted); 
          $company=$extracted[1]; 
          preg_match("/[A-Z]{1,2}[0-9][0-9A-Z]?\s?[0-9][A-Z]{2}/",$all_text,$extracted); 
          $postcode=$extracted[0]; 
          preg_match("/Date\n*(.*-)/",$all_text,$extracted); 
          $date=trim(str_replace("/","-",str_replace("-","",$extracted[1]))); 

          $date=date("Y-m-d H:i:s",strtotime($date)); 

          preg_match("/SPECIFICATION:((.|\n)*)EQUIPMENT/",$all_text,$extracted); 
          $job_desc=trim($extracted[1])); 

          preg_match("/Resource\n*(.*)/",$all_text,$extracted); 
          $who_signed=trim(str_replace("-","",$extracted[1])); 


          $db = new PDO('mysql:host=XXX.XXX.XXX.XXX;dbname=ZZZZZZ;charset=utf8', 'USER','PASSWORD'); 
          $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

          $result=$db->query("select `job_id`,`jobs`.`client` from `stores` 
          left join `jobs` on `jobs`.`client`=`stores`.`id` 
          where `stores`.`postcode`='$postcode' and `stores`.`company`='$company' 
          and `jobs`.`description`='$job_desc'")->fetch(); 
         echo "info: "; 
         print_r($result); 
         die(); 

In diesem Fall ist $result leer!

Wenn ich tun:

echo "select `job_id`,`jobs`.`client` from `stores` 
     left join `jobs` on `jobs`.`client`=`stores`.`id` 
     where `stores`.`postcode`='$postcode' and `stores`.`company`='$company' and `jobs`.`description`='$job_desc'" 
die(); 

Es wird nur Druck:

select `job_id`,`jobs`.`client` from `stores` left join `jobs` on `jobs`.`client`=`stores`.`id` where `stores`.`postcode`='BD5 8HP' and `stores`.`company`='MATALAN' and `jobs`.`description`='MONTHLY external - Clean Both sides of External Glazing, Frames, Ledges & Entrance Doors (up to 1.8m Height) - Including Black out windows - Removing cobwebs and dust from all areas' 

Wenn ich dies in meinem PHP-Code kopiere zurück dann der Code korrekt ausgeführt wird, so dass das Problem könnte irgendwo sein mit die Zeichen umwandeln. Ich dachte, dass es wegen endash/emdash sein könnte, aber die $job_desc mit ord() zurückgegebenen Char 45 für die - was korrekt ist. auch die & scheinen korrekt zu sein.

Mir gehen die Ideen aus, gibt es etwas so Offensichtliches, das einfach nicht zu mir springt?

+0

leeres Array oder leere Zeichenfolge? Ich würde sagen, es ist ein boolescher Name falsch;) –

+0

Haben Sie versucht, Fehler zu überprüfen? Für die PDO-Fehlerbehandlung verwenden Sie '$ db-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION):'. Dadurch wird eine Ausnahme ausgelöst, sodass das Problem leichter zu erkennen ist. –

+0

versuchen Sie eine andere 'description' :-) in Ihrer' WHERE' Bedingung. oder einfach 'jobs.description LIKE 'MONTHLY external%''. Ich bin mir sicher, dass das funktionieren wird. Das Problem ist, dass Ihre Zeichenfolge an die Abfrage übergeben wird. – Alex

Antwort

0

Das Problem war mit einem falschen ASCII-Zeichen verbunden, das von der PDFTOTEXT-Ausgabe zugeführt wurde.

Implementierung einer str_replace-Funktion löste das Problem.

Vielen Dank für die Unterstützung/Vorschläge.