If-Anweisung reagiert seltsam fehlerhaft

Alles, was PHP betrifft, kann hier besprochen werden.

If-Anweisung reagiert seltsam fehlerhaft

Postby isidor2706 » 15. June 2020 23:50

Ich glaube einen Fehler im PHP-Interpreter 7.3.18 gefunden zu haben und bitte um Überprüfung der folgenden Beobachtung.

Version 1: Der Variablen $Satz wird eine Zeichenkette direkt zugewiesen. Damit reagiert die If-Anweisung in der function suchefeldindex() richtig.

Version 2: Der Variablen $Satz wird die gleiche Zeichenkette durch Einlesen von Datei zugewiesen. Damit reagiert die If-Anweisung in der function suchefeldindex() fehlerhaft.

PHP-Script:
Code: Select all
<html>
<head>
</head>
<body>
<?php

   $OW = new OIKOS_WERBE();

   echo "Version 1 richtig: <br>"; //beachte $Satz:
   $Satz = '"WerbFirmenname";"WerbStrasse";"WerbPlz";"WerbOrt";"WerbEmail";"WerbNname";"WerbTel";"WerbFax"';

   echo '<p>'.$Satz.'</p>';//Test
   $SatzFelder = explode(";", $Satz, 100);
   $SatzFelderanz = count($SatzFelder);
   echo "<p>SatzFelderanz = " . $SatzFelderanz . "</p>"; // Test

   for ($i = 0; $i < $SatzFelderanz; $i++)
   {
      $SatzFelder[$i] = str_replace ('"', '', $SatzFelder[$i]);
      $SatzFelder[$i] = trim ($SatzFelder[$i]);
      echo "SatzFelder[" . $i . "]: &gt;" . $SatzFelder[$i] . "&lt; <br>";//Test
   }

   $WerbFirmennamei = $OW -> suchefeldindex ("WerbFirmenname", $SatzFelder);
   echo "WerbFirmennamei: &gt;" . $WerbFirmennamei . "&lt; Ergebnis<br>";//Test ergibt richtig

   echo "<br><br>";

   echo "Version 2 mit Fehler: <br>";// Ursache siehe Einlesen von $Satz aus Datei:
   $fp = fopen ("AdressenLadenEingabe.csv", "r");
   $Satz = fgets ($fp);
   fclose ($fp);

   echo '<p>'.$Satz.'</p>';//Test
   $SatzFelder = explode(";", $Satz, 100);
   $SatzFelderanz = count($SatzFelder);
   echo "<p>SatzFelderanz = " . $SatzFelderanz . "</p>"; // Test

   for ($i = 0; $i < $SatzFelderanz; $i++)
   {
      $SatzFelder[$i] = str_replace ('"', '', $SatzFelder[$i]);
      $SatzFelder[$i] = trim ($SatzFelder[$i]);
      echo "SatzFelder[" . $i . "]: &gt;" . $SatzFelder[$i] . "&lt; <br>";//Test
   }

   $WerbFirmennamei = $OW -> suchefeldindex ("WerbFirmenname", $SatzFelder);
   echo "WerbFirmennamei: &gt;" . $WerbFirmennamei . "&lt; Ergebnis<br>";//Test ergibt Fehler

class OIKOS_WERBE
{
   function OIKOS_WERBE()
   {
      ;
   }

   function suchefeldindex ($dbfeld, $satz)
   {
      $anz = count ($satz);
      echo "suchefeldindex: dbfeld = ".$dbfeld." anz = " . $anz."<br>";//Test
      $index = -1;
      $lauf = 1;
      $i = 0;
      while (($lauf == 1) && ($i < $anz))
      {
         echo " satz[".$i."] = ".$satz[$i]."<br>";//Test

         if ($dbfeld == $satz[$i])//<-- Dieses if reagiert unter bestimmten Bedingungen fehlerhaft!!!
         {
            $index = $i;
            $lauf = 0;
         }
         $i++;
      }
      echo " i = ".$i."<br>";//Test

      return ($index);
   }
}


?>
</body>
</html>



Eingabedatei "AdressenLadenEingabe.csv":
Code: Select all
"WerbFirmenname";"WerbStrasse";"WerbPlz";"WerbOrt";"WerbEmail";"WerbNname";"WerbTel";"WerbFax"




Wer kann meine Beobachtung bestätigen? Ich bitte ggf. um Beheben des Fehlers im PHP-Interpreter. Danke!
isidor2706
 
Posts: 10
Joined: 16. January 2016 00:00
Operating System: Windows 10

Re: If-Anweisung reagiert seltsam fehlerhaft

Postby Altrea » 16. June 2020 00:04

Ohne es überprüft zu haben:
Wie wahrscheinlich ist es, dass in einem der meist getesteten Interpreter in einer der grundlegendsten Funktionen ein Bug existiert, der von einem Programmieranfänger zu allererst und zwar erst nach Wochen nach Release gefunden und berichtet wird?

Zu Allererst sollten wir viel wahrscheinlichere Ursachen abklopfen. Hast du dir den Rohstring der beiden Varianten mal mit var_dump ausgeben lassen und verglichen?

In welche Zeichenkodierung sind die Zeichen in deiner Textdatei gespeichert und in welcher Zeichenkodierung ist die PHP Datei gespeichert?
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 11926
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 11 Pro x64

Re: If-Anweisung reagiert seltsam fehlerhaft

Postby isidor2706 » 16. June 2020 07:48

Mit Hilfe von var_dump() und bin2hex() habe ich tatsächlich Unterschiede zwischen den beiden Versionen von $Satz gefunden, dies würde meine Beobachtung erklären. Vielen Dank für den Tipp! Die Tatsache, daß beide Versionen am Anfang der Zeichenkette einen unterschiedlichen Zeichencode haben, finde ich allerdings extrem unbefriedigend! Das Erstellen der Quelldateien erfolgte mit dem Zeichencode UTF-8 und die Einstellung in PHP.ini ist ebenfalls UTF-8. Im Übrigen bin ich bei Apachefriends zwar erst seit 2016 angemeldet, aber ich habe Programmiererfahrung schon seit 1978. ("Wunder gibt es immer wieder ...")

Neues PHP-Script zum Test:
Code: Select all
<html>
<head>
</head>
<body>
<?php

   $OW = new OIKOS_WERBE();

   echo "Version 1 richtig: <br>"; //beachte $Satz:
   $Satz = '"WerbFirmenname";"WerbStrasse";"WerbPlz";"WerbOrt";"WerbEmail";"WerbNname";"WerbTel";"WerbFax"';

   echo '<p>'.$Satz.'<br>';//Test
   echo var_dump($Satz).'<br>';//Test
   echo bin2hex($Satz).'</p>';//Test
   $SatzFelder = explode(";", $Satz, 100);
   $SatzFelderanz = count($SatzFelder);
   echo "SatzFelderanz = " . $SatzFelderanz . "<br>"; // Test

   for ($i = 0; $i < $SatzFelderanz; $i++)
   {
      $SatzFelder[$i] = str_replace ('"', '', $SatzFelder[$i]);
      $SatzFelder[$i] = trim ($SatzFelder[$i]);
      echo "SatzFelder[" . $i . "]: &gt;" . $SatzFelder[$i] . "&lt; <br>";//Test
   }

   $WerbFirmennamei = $OW -> suchefeldindex ("WerbFirmenname", $SatzFelder);
   echo "WerbFirmennamei: &gt;" . $WerbFirmennamei . "&lt; Ergebnis<br>";//Test ergibt richtig

   echo "<br><br>";

   echo "Version 2 mit Fehler: <br>";// Ursache siehe Einlesen von $Satz aus Datei:
   $fp = fopen ("AdressenLadenEingabe.csv", "r");
   $Satz = fgets ($fp);
   fclose ($fp);

   echo '<p>'.$Satz.'<br>';//Test
   echo var_dump($Satz).'<br>';//Test
   echo bin2hex($Satz).'</p>';//Test
   $SatzFelder = explode(";", $Satz, 100);
   $SatzFelderanz = count($SatzFelder);
   echo "SatzFelderanz = " . $SatzFelderanz . "<br>"; // Test

   for ($i = 0; $i < $SatzFelderanz; $i++)
   {
      $SatzFelder[$i] = str_replace ('"', '', $SatzFelder[$i]);
      $SatzFelder[$i] = trim ($SatzFelder[$i]);
      echo "SatzFelder[" . $i . "]: &gt;" . $SatzFelder[$i] . "&lt; <br>";//Test
   }

   $WerbFirmennamei = $OW -> suchefeldindex ("WerbFirmenname", $SatzFelder);
   echo "WerbFirmennamei: &gt;" . $WerbFirmennamei . "&lt; Ergebnis<br>";//Test ergibt Fehler

class OIKOS_WERBE
{
   function OIKOS_WERBE()
   {
      ;
   }

   function suchefeldindex ($dbfeld, $satz)
   {
      $anz = count ($satz);
      echo "suchefeldindex: dbfeld = &gt;".$dbfeld."&lt; anz = " . $anz."<br>";//Test
      $index = -1;
      $lauf = 1;
      $i = 0;
      while (($lauf == 1) && ($i < $anz))
      {
         echo " satz[".$i."] = &gt;".$satz[$i]."&lt; <br>";//Test

         if ($dbfeld == $satz[$i])//<-- Dieses if reagiert unter bestimmten Bedingungen fehlerhaft!!!
         {
            $index = $i;
            $lauf = 0;
         }
         $i++;
      }
      echo " i = ".$i."<br>";//Test

      return ($index);
   }
}


?>
</body>
</html>



Zugehörige Eingabedatei wie im ersten Beitrag.
isidor2706
 
Posts: 10
Joined: 16. January 2016 00:00
Operating System: Windows 10

Re: If-Anweisung reagiert seltsam fehlerhaft

Postby Altrea » 16. June 2020 08:34

isidor2706 wrote:Im Übrigen bin ich bei Apachefriends zwar erst seit 2016 angemeldet, aber ich habe Programmiererfahrung schon seit 1978. ("Wunder gibt es immer wieder ...")

Ich wollte dir nicht zu Nahe treten oder dir gar deine generelle Programmiererfahrung absprechen. Tut mir leid, wenn das so geklungen hat.
Die Tatsache, dass du var_dump nicht selbst versucht hast deutet aber darauf hin, dass du im Bereich PHP Script Debugging nicht soviel Erfahrung zu haben scheinst.
In jeder Programmiersprache (und ganz unabhängig von der Erfahrung) sollte es aber gängige Praxis sein, seinen eigenen Code und die Quellinformationen im Zweifel zu ziehen, wenn man ein unerwartetes Ergebnis erhält.

Ich habe weiterhin Probleme dein Beispiel nachzustellen. Nehme ich deinen Code aus dem letzten Beitrag und erstelle mir manuell die csv Datei dazu, erhalte ich für Version 1 und Version 2 identische Ergebnisse.
Nun wäre es interessant zu wissen, was dir dein Script ausgibt.

P.S.: Deine gesamte Funktion "suchefeldindex" scheint nur den Zweck zu erfüllen, ein Array nach einem Wert zu durchsuchen und dessen Schlüssel zurückzugeben. Hier bietet sich stattdessen die PHP Funktion array_search() an.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 11926
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 11 Pro x64

Re: If-Anweisung reagiert seltsam fehlerhaft

Postby isidor2706 » 16. June 2020 10:39

Das PHP-Script liefert bei mir die folgende Anzeige:

[list=][*]
Version 1 richtig:

"WerbFirmenname";"WerbStrasse";"WerbPlz";"WerbOrt";"WerbEmail";"WerbNname";"WerbTel";"WerbFax"
string(94) ""WerbFirmenname";"WerbStrasse";"WerbPlz";"WerbOrt";"WerbEmail";"WerbNname";"WerbTel";"WerbFax""
22576572624669726d656e6e616d65223b225765726253747261737365223b2257657262506c7a223b22576572624f7274223b2257657262456d61696c223b22576572624e6e616d65223b225765726254656c223b225765726246617822
SatzFelderanz = 8
SatzFelder[0]: >WerbFirmenname<
SatzFelder[1]: >WerbStrasse<
SatzFelder[2]: >WerbPlz<
SatzFelder[3]: >WerbOrt<
SatzFelder[4]: >WerbEmail<
SatzFelder[5]: >WerbNname<
SatzFelder[6]: >WerbTel<
SatzFelder[7]: >WerbFax<
suchefeldindex: dbfeld = >WerbFirmenname< anz = 8
satz[0] = >WerbFirmenname<
i = 1
WerbFirmennamei: >0< Ergebnis


Version 2 mit Fehler:

"WerbFirmenname";"WerbStrasse";"WerbPlz";"WerbOrt";"WerbEmail";"WerbNname";"WerbTel";"WerbFax"
string(99) ""WerbFirmenname";"WerbStrasse";"WerbPlz";"WerbOrt";"WerbEmail";"WerbNname";"WerbTel";"WerbFax" "
efbbbf22576572624669726d656e6e616d65223b225765726253747261737365223b2257657262506c7a223b22576572624f7274223b2257657262456d61696c223b22576572624e6e616d65223b225765726254656c223b2257657262466178220d0a
SatzFelderanz = 8
SatzFelder[0]: >WerbFirmenname<
SatzFelder[1]: >WerbStrasse<
SatzFelder[2]: >WerbPlz<
SatzFelder[3]: >WerbOrt<
SatzFelder[4]: >WerbEmail<
SatzFelder[5]: >WerbNname<
SatzFelder[6]: >WerbTel<
SatzFelder[7]: >WerbFax<
suchefeldindex: dbfeld = >WerbFirmenname< anz = 8
satz[0] = >WerbFirmenname<
satz[1] = >WerbStrasse<
satz[2] = >WerbPlz<
satz[3] = >WerbOrt<
satz[4] = >WerbEmail<
satz[5] = >WerbNname<
satz[6] = >WerbTel<
satz[7] = >WerbFax<
i = 8
WerbFirmennamei: >-1< Ergebnis
[/list]

Wie oben dargestellt, beginnt $Satz in der Version 2 mit 3 zusätzlichen Bytes (HEX): efbbbf
Diese 3 Bytes sind schon in der Eingabedatei enthalten, jedoch mit meinem Codeeditor nicht sichtbar. Die 3 unsichtbaren Bytes werden durch trim() nicht entfernt, auf diese Weise ist der beobachtete Fehler entstanden. Nachdem ich die Eingabedatei ohne die unsichtbaren Bytes neu erstellt habe, funktioniert mein Script richtig. Bin sehr erleichtert! Möchte anregen zu prüfen, ob trim() so erweitert werden kann, daß es auch die genannten 3 Bytes entfernt.
isidor2706
 
Posts: 10
Joined: 16. January 2016 00:00
Operating System: Windows 10

Re: If-Anweisung reagiert seltsam fehlerhaft

Postby Altrea » 16. June 2020 11:14

EF BB BF ist das sogenannte Byte Order Mark. PHP geht bei UTF-8 Dateien generell davon aus, dass diese ohne BOM kodiert sind.
Sollte es nicht möglich sein schon bei der CSV Erstellung auf auf das BOM zu verzichten gibt es auch unterschiedliche Möglichkeiten dieses BOM durch PHP Funktionen aus einem String zu entfernen.
Google liefert hierzu unterschiedliche Möglichkeiten, die du übernehmen kannst.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 11926
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 11 Pro x64

Re: If-Anweisung reagiert seltsam fehlerhaft

Postby Altrea » 16. June 2020 11:29

Hier ist zum Beispiel eine saubere Lösung
Code: Select all
//Remove UTF8 Bom
function remove_utf8_bom($text) {
    $bom = pack('H*','EFBBBF');
    $text = preg_replace("/^$bom/", '', $text);
    return $text;
}



isidor2706 wrote:Möchte anregen zu prüfen, ob trim() so erweitert werden kann, daß es auch die genannten 3 Bytes entfernt.

Naja, trim soll whitespaces und Steuerzeichen abtrennen. Technisch gesehen ist ein BOM kein Whitespace oder Steuerzeichen sondern ein Kennzeichen das die Zeichenkodierung angibt.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 11926
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 11 Pro x64

Re: If-Anweisung reagiert seltsam fehlerhaft

Postby Nobbie » 16. June 2020 11:34

isidor2706 wrote:Möchte anregen zu prüfen, ob trim() so erweitert werden kann, daß es auch die genannten 3 Bytes entfernt.


Code: Select all
$SatzFelder[$i] = trim($SatzFelder[$i], "\\xef\\xbb\\xbf");
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: If-Anweisung reagiert seltsam fehlerhaft

Postby isidor2706 » 16. June 2020 12:56

BOM-entfernen klappt prima, danke!
isidor2706
 
Posts: 10
Joined: 16. January 2016 00:00
Operating System: Windows 10


Return to PHP

Who is online

Users browsing this forum: No registered users and 16 guests