[gelöst] Browsergame - direktes 1 vs. 1



  • RandomAccess85 schrieb:

    Hallo,

    Sorry mein Fehler!

    $result = mysql_fetch_array(mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=".$_POST['id'])); 
    echo ($result['ergebnis']);
    

    Was du uns allerdings mit 0123 sagen willst ist mir schleierhaft! Davon ausgehend die ID sei Integer, gibt es sowieso keine voranstehende 0 😕

    LG

    0123 wirft bei mysql nen syntax error ohne quotes wegen der null ... php interpretiert es aber als octalen zahlenwert.

    (wenn ich nicht falsch liege :D)


  • Mod

    PRIEST schrieb:

    0123 wirft bei mysql nen syntax error ohne quotes wegen der null ... php interpretiert es aber als octalen zahlenwert.

    (wenn ich nicht falsch liege :D)

    exakt.

    deshalb: bitte bitte bitte user eingaben ordentlich validieren.

    wenn ihr so dumme sachen wie is_numeric macht, dann führt das zwangsweise zu Bugs. Denn niemand kann die ganzen implikationen kennen die daraus entstehen. es erwartet ja auch niemand dass man sie alle kennt - es ist ja auch unnötig.

    man validiert korrekt und es gibt keine probleme:

    if(!isset($_POST['id'])) throw new exception();
    $id = $_POST['id'];
    $result = sql_query(
      "SELECT text AS ergebnis FROM tabelle WHERE id=':id:'",
      array('id' => $id)
    ); //prepared statement benutzen oder anderweitig escapen
    if($result===false) throw new exception();
    //im idealfall wirft sql_query bereits diese exception
    $result=mysql_fetch_assoc();
    if($result===false) throw new exception();
    //im idealfall wirft fetch direkt eine exception
    echo ($result['ergebnis']);
    

    toller ist das ganze natürlich wenn man die sachen etwas mehr kapselt. zb auch keine rohen sql queries mehr im code stehen lässt, etc. aber was essentiell ist: validieren der eingabe.

    desto mehr und besser man kapselt, desto weniger muss man selber tun.

    bei mir könnte das zB so aussehen:

    require_input($_POST, 'id');
    $result=$db->query('some query', array('id' => $_POST['id']))->fetch_single();
    echo $result['ergebnis'];
    


  • Shade Of Mine schrieb:

    PRIEST schrieb:

    0123 wirft bei mysql nen syntax error ohne quotes wegen der null

    exakt.

    Also bei mir nicht. Hab's mit PHPMyAdmin auf meinem Heimserver nachgespielt. 🙄
    Meines Erachtens nach aber wuerde bei dem Versuch einen Nicht-Zahlenwert in Integer zu casten eine Fehlermeldung in PHP auswerfen, und genau das wollte ich damit nur vermeiden.


  • Mod

    heini schrieb:

    Also bei mir nicht. Hab's mit PHPMyAdmin auf meinem Heimserver nachgespielt. 🙄

    Dann haben sie das in mysql irgendwann mal angepasst. früher war es jedenfalls so, dass 01 ein fehler war.

    jedenfalls wird 01 mit mysql 5 korrekt verstanden, lediglich als dezimal zahl, während es in php eine oktal zahl ist.

    Meines Erachtens nach aber wuerde bei dem Versuch einen Nicht-Zahlenwert in Integer zu casten eine Fehlermeldung in PHP auswerfen, und genau das wollte ich damit nur vermeiden.

    nein. so ein cast schlägt nie fehl:

    v==(int)v==(int)v
    ist zb ein sehr naiver test ob $v eine zahl ist.



  • Shade Of Mine schrieb:

    nein. so ein cast schlägt nie fehl:

    v==(int)v==(int)v
    ist zb ein sehr naiver test ob $v eine zahl ist.

    Kann man so nicht sagen

    $v = (int)"Hallo" ? "ok" : "failed";
    

    ... ergibt zum Beispiel "failed".

    LG



  • RandomAccess85 schrieb:

    $v = (int)"Hallo" ? "ok" : "failed";
    

    Das ist etwa das Glieche, wie:

    $v=0;
    echo ($v ? "ok" : "failed");
    

    Das Problem ist einfach, dass 0 mit false gleichgesetzt wird. Da "Hallo" keine Zahl enthaelt, wird das zur 0 und damit bei der Abfrage als false gewertet. Anders wuerde es damit laufen:

    $v = (int)"Hallo";
    if($v!==false) echo "ok";
    else echo "failed";
    

    Wichtig ist der !== Operator.


  • Mod

    RandomAccess85 schrieb:

    Shade Of Mine schrieb:

    nein. so ein cast schlägt nie fehl:

    v==(int)v==(int)v
    ist zb ein sehr naiver test ob $v eine zahl ist.

    Kann man so nicht sagen

    $v = (int)"Hallo" ? "ok" : "failed";
    

    ... ergibt zum Beispiel "failed".

    Und?
    Der cast ist nicht fehlgeschlagen, du hast 0 als Wert erhalten.



  • Hallo,

    na um die Fehlerbehandlung kann man sich - wenn man schon an der Stelle ist - auch selbst kümmern.

    $v = (int)"Hallo" ? "ok" : "failed"; // $v = failed
    $v = (int)1 ? "ok" : "failed";       // $v = ok
    

    *zu faul zum Einloggen

    LG


  • Mod

    RandomAccess85* schrieb:

    Hallo,

    na um die Fehlerbehandlung kann man sich - wenn man schon an der Stelle ist - auch selbst kümmern.

    $v = (int)"Hallo" ? "ok" : "failed"; // $v = failed
    $v = (int)1 ? "ok" : "failed";       // $v = ok
    

    *zu faul zum Einloggen

    LG

    $v = (int)0 ? "ok" : "failed"; // v=failedv = failed v = (int)"123abc" ? "ok" : "failed"; // $v = ok



  • Ok,

    ich verstehe den Einwand 👍

    LG


Anmelden zum Antworten