Tolwin: Prüfung einer Resource ID mit PHP scheitert

Hallo Forum,

ich habe ein kleines Skript welches in einer MySQL Datenbank alle
Datensätze SELECTEn soll auf die das im Statement gesendete Muster passen.
Wenn der Datensatz nicht gefunden wird, soll ein neuer mit
entsprechenden Daten in der Datenbank angelegt werden. Hierzu prüfe
ich, ob $search_result gesetzt bzw. etwas zurückliefert oder nicht.
Leider komme ich so nicht in die IF Bedingung ...

Bekommt man immer eine Resource ID, auch wenn der SELECT nix findet?
Wenn das so ist, wie könnte ich alternativ vorgehen?

while($row = mysql_fetch_assoc($result)) {
 $date = strtotime($row['Plandatum']);
 $search_result = mysql_query("SELECT * FROM calendardate WHERE short_description LIKE '%$row[ChangeId]%' AND event_date LIKE $date", $connect2);
 if(!isset($search_result)) {
  mysql_query("INSERT INTO calendardate (event_date, duration, short_description, long_description, userid) VALUES ($date, '0', '$row[ChangeId] $row[Bezeichnung]', '$row[Bezeichnung]', 'admin' )", $connect2);
 }
}

Viele Grüße
Tolwin

  1. Ahoi Tolwin,

    if(!isset($search_result)) {

    hier ist der Fehler, eine Variable die NULL als wert hat, leere Strings usw. gelten als gesetzt. abgesehen davon solltest du das if rausnehmen aus der schleife,... Denn nicht alle rowas haben den gleichen inhalt. Wenn du verstehst was ich meine.

    MfG

    1. Danke Zusammen,
      das hilft mir weiter!

      Viele Grüße
      Tolwin

    2. echo $begrüßung;

      if(!isset($search_result)) {

      hier ist der Fehler, eine Variable die NULL als wert hat, leere Strings usw. gelten als gesetzt.

      Das ist nicht richtig. Der PHP-Typ null ist nicht identisch mit einem Leerstring oder einer Integer-0. Ein (einfacher) Typvergleich ergibt da zwar übereinstimmung, aber auch nur, weil PHP eine automatische Typumwandlung vornimmt. Weiterhin liefert ein isset() bei einer zwar vorhandenen aber mit null gefüllten Variable ein false.

      $var = null;
        var_dump(isset($var)); -> false

      echo "$verabschiedung $name";

  2. hi,

    Bekommt man immer eine Resource ID, auch wenn der SELECT nix findet?

    Natürlich.
    Estwas anderes, als eine Resource-ID, gibt es nur im Fehlerfall.

    Wenn das so ist, wie könnte ich alternativ vorgehen?

    Prüfe, wie viele Datensätze du zurückbekommst - mysql_num_rows.
    Oder, wenn du an den Datensätzen selbst überhaupt nicht interessiert bist, sondern nur an ihrer Anzahl - dann wäre es blödsinnig, sie überhaupt zu selektieren - dann verwende COUNT, und werte das Ergebnis aus.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. Ahoi Tolwin,

    im Manual unter: http://de.php.net/manual/de/function.mysql-query.php steht:

    Nur für SELECT, EXPLAIN, SHOW oder DESCRIBE Anweisungen liefert mysql_query() eine Ressourcen-Kennung oder FALSE, falls die Anfrage nicht korrekt ausgeführt wurde. Für alle anderen SQL Anweisungen ist der Rückgabewert von mysql_query() im Erfolgsfall TRUE, im Fehlerfall FALSE. Ein Rückgabewert ungleich FALSE bedeutet, dass die Anfrage gültig war und vom Server ausgeführt werden konnte. Das alleine sagt jedoch überhaupt nichts über die Anzahl veränderter oder gelieferter Datensätze aus. Es ist durchaus möglich, dass eine Anfrage erfolgreich war, ohne einen einzigen Datensatz zur verändern oder zu liefern.

    MfG

  4. echo $begrüßung;

    $search_result = mysql_query("SELECT * FROM calendardate WHERE short_description LIKE '%$row[ChangeId]%' AND event_date LIKE $date", $connect2);
    if(!isset($search_result)) {

    Die Variable $search_result existiert im Gut- und im Fehlerfall[*]. mysql_query() liefert entweder eine Ressourcenkennung oder ein false zurück. Und isset($search_result) liefert deshalb immer true. Nur bei null als Inhalt und "echter Nichtexistenz" liefert isset() false.

    [*] Eine leere Datenmenge nach einer Abfrage ist übrigens kein Fehlerfall.

    echo "$verabschiedung $name";