acardi: PHP - CSV durchsuchen

Hallo,

ich habe eine csv Datei, die ich anhand einer Formular Eingabe durchsuchen möchte.

Bisher habe ich folgendes zusammengebretzelt:

<?php

$ctisearch = $_GET["ctisearch"];

echo $ctisearch;

$Zeilen = 1;
$csvopen = fopen("stol.csv", "r");

$row = 1;

while ($data = fgetcsv ($csvopen, 1000, ",")) {
    if ($data[0] == $ctisearch) {
      echo "Gefunden in Zeile " . $row . ": ";
      echo "Spalte 2: " . $data[1] . " -- ";
      echo "Spalte 3: " . $data[2] . " -- ";
      echo "Spalte 4: " . $data[3] . "<br />";
    }
    $row++;

}

fclose($csvopen);

?>

Es funktioniert allerdings nicht. Die Formular Übergabe ist kein Problem, klappt, aber in meiner Schleife scheint ein Problem mit den Arrays zu sein, allerdings erkenne ich es nicht.

Die Schleife durchläuft auch ohne Probleme, nur ein Ergebnis liefert sie nicht.

Ich wäre sehr für Hilfe verbunden,

einen freundlichen Gruß

  1. Ich wäre sehr für Hilfe verbunden,

    FIND

    while ($data = fgetcsv ($csvopen, 1000, ",")) {

    INSERT AFTER
    echo 'debugausgabe: ' . $data[0] . '<br />';

    1. Ich wäre sehr für Hilfe verbunden,

      FIND

      while ($data = fgetcsv ($csvopen, 1000, ",")) {

      INSERT AFTER
      echo 'debugausgabe: ' . $data[0] . '<br />';

      Jetzt steht da 1900x "debugausgabe" ;-)

      Wie genau soll mir dieser Tipp weiterhelfen?

      Grüße

      1. echo $begrüßung;

        Jetzt steht da 1900x "debugausgabe" ;-)

        Vermutlich bekommst du auch noch 1900 Hinweismeldungen, wenn du das error_reporting auf E_ALL stellst (und display_errors auf on). PHP unterdrückt dann nicht mehr die Hinweismeldungen bei Zugriffen auf nicht vorhandene Variablen. Eine solche liegt möglicherweise vor.

        Wie genau soll mir dieser Tipp weiterhelfen?

        Du sollst dir die Werte der beteiligten Variablen ausgeben lassen, um so Wunsch und Wirklichkeit miteinander zu vergleichen. Kontrollausgaben sind das einfachste und wirkungsvollste Mittel zur Fehlersuche. Deutlich genauer als ein echo ist übrigens die Funktion var_dump().

        echo "$verabschiedung $name";

        1. Ich bekomme keine 1900 Hinweismeldungen, lediglich folgende:

          Notice: Undefined index: ctisearch in suche.php on line 11

          Allerdings ist die Variable definiert.

          Es werden immer die ersten 8 Einträge angezeigt, es wird also nicht richtig gesucht.

          Aber mit "if ($data[0] == $ctisearch)" vergleiche ich doch, oder etwa nicht?

          Grüße

          echo $begrüßung;

          Jetzt steht da 1900x "debugausgabe" ;-)

          Vermutlich bekommst du auch noch 1900 Hinweismeldungen, wenn du das error_reporting auf E_ALL stellst (und display_errors auf on). PHP unterdrückt dann nicht mehr die Hinweismeldungen bei Zugriffen auf nicht vorhandene Variablen. Eine solche liegt möglicherweise vor.

          Wie genau soll mir dieser Tipp weiterhelfen?

          Du sollst dir die Werte der beteiligten Variablen ausgeben lassen, um so Wunsch und Wirklichkeit miteinander zu vergleichen. Kontrollausgaben sind das einfachste und wirkungsvollste Mittel zur Fehlersuche. Deutlich genauer als ein echo ist übrigens die Funktion var_dump().

          echo "$verabschiedung $name";

          1. Ich bekomme keine 1900 Hinweismeldungen, lediglich folgende:

            Notice: Undefined index: ctisearch in suche.php on line 11
            Allerdings ist die Variable definiert.

            ja, es wird aus GET übernommen wie es scheint

            Es werden immer die ersten 8 Einträge angezeigt, es wird also nicht richtig gesucht.

            Aber mit "if ($data[0] == $ctisearch)" vergleiche ich doch, oder etwa nicht?

            könnte es sein, das $ctisearch ein array ist oder ist in $ctisearch überhaupt etwas enthalten?

            $ctisearch = $_GET["ctisearch"];

            ggf solltest du mit isset oder isempty prüfen, ob in $_GET["ctisearch"]; überhaupt irgendwas daherkommt

            1. Der echo() zeigt mir an, dass durch GET etwas übernommen wird .. die Formular Übergabe funktioniert.

              Auch der Abgleich scheint zu funktionierne, denn wenn ich einen Suchbegriff eingebe erscheinen nicht alle Einträge - nämlich gar keiner.

              Selbst wenn ich nur den Buchstaben "h" suchen lasse, kommt nichts.

              Irgendwo sitzt dadrin noch der Wurm?

              Ich bekomme keine 1900 Hinweismeldungen, lediglich folgende:

              Notice: Undefined index: ctisearch in suche.php on line 11
              Allerdings ist die Variable definiert.
              ja, es wird aus GET übernommen wie es scheint

              Es werden immer die ersten 8 Einträge angezeigt, es wird also nicht richtig gesucht.

              Aber mit "if ($data[0] == $ctisearch)" vergleiche ich doch, oder etwa nicht?

              könnte es sein, das $ctisearch ein array ist oder ist in $ctisearch überhaupt etwas enthalten?

              $ctisearch = $_GET["ctisearch"];
              ggf solltest du mit isset oder isempty prüfen, ob in $_GET["ctisearch"]; überhaupt irgendwas daherkommt

              1. Wenn ich GET mit print_r ausgebe erscheint auch die Formulareingabe, genau wie beim echo.

                Die CSV Datei wird auch korrekt eingegeben ... mache ich die Kontrolle gibt er die ausgewählten Arrays aus.

                Mir steht ein Fragezeichen auf der Stirn geschrieben ;-)

                Moin

                Ja, ich möchte das Rad neu erfinden :-)

                Ich möchte kein Fertigscript nehmen, sondern verstehen, was mein Script macht!

                Löblich Löblich,

                Was wird ausgegeben, wenn du $_GET mit print_r() ausgibst?
                Als nächste würde ich als Kontrolle $data[0] innerhalb der whileschleife (noch vor der If-Abfrage) ausgeben, um zu schauen, das die CSV korrekt eingelesen wird.

                Poste bitte das Ergebnis (in abgekürzter Form)

                Gruß Bobby

                1. Moin

                  Ok, ich glaube ich weiß wo dein Problem liegt. Du suchst nach bestimmten Zeichen in der Zeichenkette $data[0].
                  Bei der Abfrage if ($data[0] == $ctisearch) müssen jedoch die beiden Werte exakt übereinstimmen um ein positives Ergebnis zu erhalten..

                  du musst eine String-Funktion anwenden um auf Zeichen zu prüfen, die innerhalb einer Zeichenkette vorkommen.
                  stristr() wäre eine solche Funktion:

                  also: if (stristr ( $data[0], $ctisearch ))

                  wäre die geeignete Abfrage.

                  Gruß Bobby

                  --
                  -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
                  -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
                  ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
                  1. Sehr, sehr guter Tipp! Das wars :-)

                    Vielen Dank dafür!

                    also: if (stristr ( $data[0], $ctisearch ))

                    wäre die geeignete Abfrage.

                    1. Moin

                      Sehr, sehr guter Tipp! Das wars :-)

                      Vielen Dank dafür!

                      Gut.

                      Dazu ein Hinweis:
                      Versuche bitte beim nächsten Mal auf dein Problem näher einzugehen. Angefangen mit der Erklärung mit welchen Daten was passieren soll. Hättest du von vornherein gesagt, das du nach einer bestimmten Zeichen innerhalb einer Zeichenkette suchst, hättest du die Antwort viel schneller bekommen. Ich bin auf dein eigentliches Problem nur duch deine Aussage mit dem "h" als Suchstring gestossen.

                      Du siehst, eine möglichst genaue Problembeschreibung hilft dem Fragenden und den Antwortenden.

                      Gruß Bobby

                      --
                      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
                      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
                      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
              2. Es werden immer die ersten 8 Einträge angezeigt, es wird also nicht richtig gesucht.

                Aber mit "if ($data[0] == $ctisearch)" vergleiche ich doch, oder etwa nicht?

                wenn deine schleife 1900 durchläufe hat, brich sie mit break nach sagen wir 25 durchläufen ab und du beschränkst deine ausgabe auf einfache art und weise

                jetzt fügst in der schleife

                folgendes ein:
                echo 'data: "' . $data[0] . '"<br />';
                echo 'cti: "' . $ctisearch . '"<br />';

                oder wie schon vorgeschlagen mit var_dump
                echo 'data: "' . var_dump($data[0]) . '"<br />';
                echo 'cti: "' . var_dump($ctisearch) . '"<br />';

                wenn du mit == als vergleichsoperator arbeitest und nur strings/zahlen usw gemischt vergleichen willst, ist vardump nicht zwingend erforderlich, da der datentyp eigentlich egal ist

                wenn du datentypen vergleichen willst (mit ===) ist var_dump essentiell wichtig, da der string(true) != bool(true) ist

                wenn du jetzt zb da stehen hast
                data: "foobar"
                cti: "snafu"
                kannst du dir sicher sein, dass dein if nicht zutreffen wird

                data: "foobar "
                cti: "foobar"
                das würde auch nicht zutreffen - für solche fälle empfiehlt sich trim()

                1. Es werden nur alle Einträge angezeigt, wenn ich auch zur Einleseüberprüfung einen echo rausgebe.

                  Im Normalfall, ohne üÜberprüfungsecho, erscheinen keine Suchtreffer!
                  Gebe ich gar nichts ein, kommen die ersten 8 Einträge!

                  Ich hoffe die Informationen helfen bei der Lösungssuche.

                  Es werden immer die ersten 8 Einträge angezeigt, es wird also nicht richtig gesucht.

                  Aber mit "if ($data[0] == $ctisearch)" vergleiche ich doch, oder etwa nicht?

                  wenn deine schleife 1900 durchläufe hat, brich sie mit break nach sagen wir 25 durchläufen ab und du beschränkst deine ausgabe auf einfache art und weise

                  jetzt fügst in der schleife

                  folgendes ein:
                  echo 'data: "' . $data[0] . '"<br />';
                  echo 'cti: "' . $ctisearch . '"<br />';

                  oder wie schon vorgeschlagen mit var_dump
                  echo 'data: "' . var_dump($data[0]) . '"<br />';
                  echo 'cti: "' . var_dump($ctisearch) . '"<br />';

                  wenn du mit == als vergleichsoperator arbeitest und nur strings/zahlen usw gemischt vergleichen willst, ist vardump nicht zwingend erforderlich, da der datentyp eigentlich egal ist

                  wenn du datentypen vergleichen willst (mit ===) ist var_dump essentiell wichtig, da der string(true) != bool(true) ist

                  wenn du jetzt zb da stehen hast
                  data: "foobar"
                  cti: "snafu"
                  kannst du dir sicher sein, dass dein if nicht zutreffen wird

                  data: "foobar "
                  cti: "foobar"
                  das würde auch nicht zutreffen - für solche fälle empfiehlt sich trim()

                  1. Im Normalfall, ohne üÜberprüfungsecho, erscheinen keine Suchtreffer!
                    Gebe ich gar nichts ein, kommen die ersten 8 Einträge!

                    das sollte nicht sein - es sollten keine oder alle kommen ( je nachdem, ob das if zutriff oder nicht)

                    Ich hoffe die Informationen helfen bei der Lösungssuche.

                    die lösung musst du selbst finden ;)

                    mach folgendes: "wirf dein script weg" - sprich benenn es um und mach ein neues

                    fange mit folgendem an:

                    <?php
                      echo $_GET['ctisearch'];
                    ?>

                    dann mach folgendes

                    <?php
                      // prüfen ob ctisearch nicht gesetzt ist oder leer ist
                      if (!isset($_GET['ctisearch']) || isempty($_GET['ctisearch']) {
                        echo 'suchbegriff nicht gesetzt oder leer';
                      } else {
                        echo $_GET['ctisearch'];
                      }
                    ?>

                    nach diesem schema baust du dein komplettes script nach und gibst an allen ecken und enden debugausgaben aus, sonst wirst du niemals dahinterkommen, wann was passiert

          2. echo $begrüßung;

            Bitte zitiere nur das, worauf du dich beziehst, nicht einfach alles. Danke.

            Notice: Undefined index: ctisearch in suche.php on line 11
            Allerdings ist die Variable definiert.

            Es geht nicht um eine Variable sondern um den Index-Wert ctisearch, der in deinem Fall im Array $_GET erwartet wird. Der Hinweis kommt ja nicht von ungefähr. Wenn PHP sagt, der Indexwert sei nicht vorhanden, dann ist das so. Vielleicht hast du einen Tippfehler im Formular und der Indexwert heißt anders.

            Es werden immer die ersten 8 Einträge angezeigt, es wird also nicht richtig gesucht.

            Daran ist aber sicher nicht PHP schuld. Mach weitere Kontrollausgaben. Du kannst auch das Ergebnis eines Vergleichs kontrollieren. Z.B.

            var_dump($data[0] == $ctisearch);

            Aber mit "if ($data[0] == $ctisearch)" vergleiche ich doch, oder etwa nicht?

            Ja, nur was du womit vergleichst, kann dir nur eine Kontrollausgabe offenbaren.

            echo "$verabschiedung $name";

  2. Hi,

    bist Du Dir sicher, dass Du an dieser Stelle das Rad neu erfinden willst?
    Du könntest auch einfach eine fertige Klasse zum Parsen einer CSV-Datei nehmen.
    Eine Suche nach "CSV" auf phpclasses.org brachte 441 Treffer...

    Hier wäre ein Beispiel:
    http://www.phpclasses.org/browse/package/4122.html

    Viele Grüße,
    Andreas

    1. Moin

      bist Du Dir sicher, dass Du an dieser Stelle das Rad neu erfinden willst?

      Manchmal ist es besser das Rad neu zu erfinden, um dessen wirkungsweise zu verstehen!!!!

      Außerdem wird hier nichts neu erfunden, sondern lediglich eine _kleine_ Abfrage mit PHP gestaltet!

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      1. Ja, ich möchte das Rad neu erfinden :-)

        Ich möchte kein Fertigscript nehmen, sondern verstehen, was mein Script macht!

        Grüße

        Moin

        bist Du Dir sicher, dass Du an dieser Stelle das Rad neu erfinden willst?

        Manchmal ist es besser das Rad neu zu erfinden, um dessen wirkungsweise zu verstehen!!!!

        Außerdem wird hier nichts neu erfunden, sondern lediglich eine _kleine_ Abfrage mit PHP gestaltet!

        Gruß Bobby

        1. Außerdem wird hier nichts neu erfunden, sondern lediglich eine _kleine_ Abfrage mit PHP gestaltet!

          guter plan - also weiter im andern diskussionsast ;)

        2. Moin

          Ja, ich möchte das Rad neu erfinden :-)

          Ich möchte kein Fertigscript nehmen, sondern verstehen, was mein Script macht!

          Löblich Löblich,

          Was wird ausgegeben, wenn du $_GET mit print_r() ausgibst?
          Als nächste würde ich als Kontrolle $data[0] innerhalb der whileschleife (noch vor der If-Abfrage) ausgeben, um zu schauen, das die CSV korrekt eingelesen wird.

          Poste bitte das Ergebnis (in abgekürzter Form)

          Gruß Bobby

          --
          -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
          -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
          ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
          1. Wenn ich GET mit print_r ausgebe erscheint auch die Formulareingabe, genau wie beim echo.

            Die CSV Datei wird auch korrekt eingegeben ... mache ich die Kontrolle gibt er die ausgewählten Arrays aus.

            Mir steht ein Fragezeichen auf der Stirn geschrieben ;-)

            Moin

            Ja, ich möchte das Rad neu erfinden :-)

            Ich möchte kein Fertigscript nehmen, sondern verstehen, was mein Script macht!

            Löblich Löblich,

            Was wird ausgegeben, wenn du $_GET mit print_r() ausgibst?
            Als nächste würde ich als Kontrolle $data[0] innerhalb der whileschleife (noch vor der If-Abfrage) ausgeben, um zu schauen, das die CSV korrekt eingelesen wird.

            Poste bitte das Ergebnis (in abgekürzter Form)

            Gruß Bobby