Julchen: Bei Abfrage prüfen, ob Datenbank erreichbar ist

Hallo liebe Leute,

ich muss per PHP eine SQL-Abfrage machen, bei der geprüft wird, ob ein bestimmter Eintrag in der Datenbanktabelle schon vorhanden ist. Wenn ja, wird eine bestimmte Aktion durchgeführt.

Bis jetzt habe ich das mit

if(mysql_num_rows($query)==0)
{
//Aktion!
}

gemacht.

Problem: Wenn die Datenbanktabelle kurzfristig aus irgendwelchen Gründen nicht erreichbar ist, z.B. weil der Server einen Ausfall hat, o.ä., dann wird die Aktion auch ausgeführt.

Wie kann ich also in den if-Befehl noch mit aufnehmen, dass eine weitere Bedingung ist, dass die Tabelle überhaupt da ist?

1000 Dank!

  1. 'ǝɯɐu$ ıɥ

    Wie kann ich also in den if-Befehl noch mit aufnehmen, dass eine weitere Bedingung ist, dass die Tabelle überhaupt da ist?

    if (mysqli_connect_errno()) {  
        die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');  
    }
    

    http://de2.php.net/mysqli_connect_errno

    jaja, die() ist keine fehlerbehandlung :-)

    ssnɹƃ
    ʍopɐɥs

    --
    Answers: $1, Short: $5, Correct: $25, dumb looks are still free ...
    1. mmhh.. die Fehlermeldung interessiert mich eigentlich gar nicht. Ich will nur, dass bei Nichterreichbarkeit die Aktion nicht ausgeführt wird. Wäre dann also

      if(mysql_num_rows($query)==0 && mysqli_connect_error='')
      {
      //Aktion!
      }

      das Richtige?

      1. 'ǝɯɐu$ ıɥ

        mmhh.. die Fehlermeldung interessiert mich eigentlich gar nicht. Ich will nur, dass bei Nichterreichbarkeit die Aktion nicht ausgeführt wird. Wäre dann also

        if(mysql_num_rows($query)==0 && mysqli_connect_error='')
        {
        //Aktion!
        }

        das Richtige?

        if (mysqli_connect_errno()) {  
            die ();  
        } else (mysql_num_rows($query)==0)  
         {  
         //Aktion!  
         }
        

        oder sowas (du willst ja nur prüfen ob die db erreichbar ist):

        <?php  
        $link = @mysqli_connect('localhost', 'fake_user', 'my_password', 'my_db');  
          
        if (!$link) {  
            die(); // oder was anderes  
        } else (mysql_num_rows($query)==0)  
         {  
         //Aktion!  
         }  
        ?>
        

        ließ dir bitte verlinkte seiten durch...

        ssnɹƃ
        ʍopɐɥs

        --
        Answers: $1, Short: $5, Correct: $25, dumb looks are still free ...
  2. Hello,

    ich muss per PHP eine SQL-Abfrage machen, bei der geprüft wird, ob ein bestimmter Eintrag in der Datenbanktabelle schon vorhanden ist. Wenn ja, wird eine bestimmte Aktion durchgeführt.

    Bis jetzt habe ich das mit

    if(mysql_num_rows($query)==0)
    {
    //Aktion!
    }

    gemacht.

    Und Du hast dann vermutlich als nächstes erst das Insert-Query abgesetzt?
    Du hast also zwei zeitlich getrennte Queries mit einer Zeitlücke von Millionen Microsekunden dazwischen benutzt, um für vermeintliche Sicherheit zu sorgen?

    Dann hast Du Dir sowieso ein TOCTOU-Problem gebaut:
    http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use

    Du könntest das verhindern, indem Du bei de Statements bindest.
    Entweder man macht eine geschlossene Transaktion daraus und wenn das DBMS das noch nicht kann, muss man die betroffenen Tabellen sperren, bis beide Queries gelaufen sind.

    Besser wäre es allerdings, beides in einem Query abzuhandeln.

    Vielleicht hilft Dir
    http://dev.mysql.com/doc/refman/5.1/en/replace.html
    dabei weiter.

    Alternativ könnte man mit Key-Constraints arbeiten, also über das Entscheidungskriterum (das können auch mehrere Spalten sein) einen Unique Index legen.

    Dann wäre ein Doppeleintrag nicht mehr möglich.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de