ilch Forum » Allgemein » HTML, PHP, SQL,... » Variable tut nur so als ob?

Geschlossen
  1. #1
    User Pic
    TronKiller gelöschter User
    Hallo zusammen,

    ich hab im moment einen Seltsamen Fehler. Inerhalb einer Funktion (wird nur einmal verwendet) kommt es zu einem SQL fehler, da die Variable leer ist. Jedoch wird diese Variable vor der Funktion geprüft.

    if($a < 1 or $a == ''){$a = 1;}

    und noch von der anderen Richtung:
    if($a > 499){$a = 499;}


    Hab es hier mal vereinfacht da gestellt, normal ist es etwas anders noch. Auf jeden fall ist so geprüft ob die Variable leer, kleiner 0 oder größer 499 ist.

    Natürlich könnte ich noch die funktion nutzen un dauf Numerisch prüfen, jedoch wüsste ich erst mal wie es da sein könnte, das mir per GET oder POST ein Wert eingeschleust wird, der in der SQL abfrage ein '' bewirkt ...

    Hoffe einer von euch hat eine Idee. ich wer das zwar zukünftig auf numerisch prüfen, aber man soll ja den Fehler verstehen und nicht einfach nur umschiffen.

    Mit freundlichen Grüßen

    TronKiller
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    ThE rEaL dEaL Mitglied
    Registriert seit
    28.08.2006
    Beiträge
    1.287
    Beitragswertungen
    0 Beitragspunkte
    die erste Zeile müsste doch so sein, oder?

    if($a < 1 or $a == ""){$a = 1;}
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Ithron Hall Of Fame
    Registriert seit
    21.01.2006
    Beiträge
    2.659
    Beitragswertungen
    24 Beitragspunkte
    Nein, das ist egal..

    ' und " kann man eigentlich immer verwenden (ausnahmen: reguläre ausdrücke usw. da geht nur ")


    Der Code an sich ist schon richtig (auch wenn er keinen Sinn macht wie ich finde). An dieser Abfrage liegt es nicht.
    ZitatZitat geschrieben von loW

    Ja ich habs gesehen und wenn ichs kostenlos bekomm dann zahl ich doch nix dafür oder?
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    ThE rEaL dEaL Mitglied
    Registriert seit
    28.08.2006
    Beiträge
    1.287
    Beitragswertungen
    0 Beitragspunkte
    stimmt, mein Fehler, hab die beiden ' zuerst als " gesehen, wollts dann verbessern. Dann ists mir aufgefallen, hab aber nimmer dran gedacht xD sry


    Zuletzt modifiziert von ThE rEaL dEaL am 26.08.2008 - 16:02:58
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    Hey, TronKiller!

    Etwas mehr Code wäre schon geil...

    Aber vielleicht willst du das auch gar nicht. Du könntest es mal vor der Überprüfung mit
    print_r("a = ".$a."<br>");
    und nach der Überprüfung auch versuchen, das etwas einzugrenzen, PRINT gibt dir den Wert von a mal aus. So kannst du sehen, ob diese Überprüfung auch wirkt.

    Und auch mal die reine SQL Abfrage mit print_r() ausgeben.

    Mit böhsen Grüßen
    BöhserDavid
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    TronKiller gelöschter User
    Hi,

    mehr code bringt da leider garnichts. Ich selber hab den Fehler noch nicht hinbekommen, hab nur durch den debugglog gemerkt das es nen paar spieler geschafft haben das die variable leer ist.

    und ich wüsste nun gerne warum die leer ist, wenn ich es nicht mal absichtlich hinbekomme.

    ich erklärs aber noch mal bissel ausführlicher

    <?php
    
    $a = $_POST[a];
    if ($a =< 1 or $a == '')
      {
      $b = 1;
      }
    elseif ($a >= 499)
      {
      $b = 499;
      }
    else
      {
      $b = $a;
      }
    
    show_function ($x, $b);
    
    echo $page;
    ?>


    In der function kommt es dann direkt zum fehler, da $b eben leer ist.

    Sorry ich bin gewohnt mit ' zu schreiben, inerhalb von "" wird in nem String ja immer nach ner variablen gesucht und das hab ich mir abgewönt schreibe eig nur noch alles mit ' außer:

    $op = '<font color="lime">'.$text.'</font>';



    also jemand noch ne idee wie es sein kann das $b inerhalb der function leer ist? da steht dann im sql fehler:

    ... WHERE galaxy = '' AND system = '' ...

    $b füllt dann z.b. system

    ich weiß das der fehler da auftritt und die function wird auch nur an der stelle genutzt.


    Ist übrigens nen kleines Game mit 800 Spielern, ich weiß also schon was ich mache. Ich mein PHP arbeitet manchmal ja echt dreckig.

    $a = 0.3;
    $b = 0.2;
    if ($a - 0.1 == $b)

    die if wird anscheind nicht true, da $a nicht 0.3 sondern 0.29999999999 ist. Das Problem hatte ich auch schon mal und ist auch im inet mehrfach dokumentiert.

    Ebenso ist mathe ja auch nicht immer die richtige stärke von php (punkt vor strich kennt der ja nicht).

    Daher denk ich das auch irgendwelche zeichen als zahl gewertet werden, aber in sql dann als leer gelten!?

    MFG TronKiller

    P.S.: Der code macht sinn, da er die zahl zwischen 1 und 499 beschränken soll. mitlerweile ist es auch noch ne prüfung auf numeric drinne, aber ich mag den fehler ja kappieren und ihn nicht einfach nur abfangen! Ohne ihn zu kennen, kann man so was nie verhindern!


    Zuletzt modifiziert von TronKiller am 26.08.2008 - 21:47:57
    0 Mitglieder finden den Beitrag gut.
  7. #7
    User Pic
    boehserdavid Mitglied
    Registriert seit
    26.08.2006
    Beiträge
    2.122
    Beitragswertungen
    2 Beitragspunkte
    Tja, deinen Fehler kann ich auch reproduzieren, das ist nicht mal schwer, weil dein Script, so wie es da steht, TOTAL unsicher ist.

    1. Werden Post Daten ungefiltert in einer MySQL-Anweisung eingebaut, womit ich dann deine ganze DB auslesen kann. Denk mal drüber nach...

    2. Kann die Variable a nur leer sein, weil es $_POST['a'] heißen muss. Aber mal angenommen es geht doch.
    Dann musst du $a als integer deklarieren mit
    $a = intval($_POST['a']);
    ansonsten ist es ein String und somit weder <= 1 OR empty() OR >= 499. Weil 1 und 499 Zahlen sind.

    Und wenn du wirklich ".... system = ' " .$b." ' " auslesen willst ist $b dann ein String, soll aber wahrscheinlich eine Zahl sein. also "... system = ".$b, natürlich muss dan auch das system die deklaration int() in der DB haben, ansonsten machst du was grundlegendes falsch.
    Weil dann kannst du nämlich in den ABfragen $b <= '1' schreiben.

    Und wenn ich mich jetzt nicht ganz irre ist bei $_POST[a] => a = konstante.

    Siehst du, mehr Code bringt doch was.
    -Heute schon böhse gewesen?- Ab zur Community
    -No Support via Contact-
    0 Mitglieder finden den Beitrag gut.
  8. #8
    User Pic
    TronKiller gelöschter User
    ops das hätte ich sagen können

    $_POST und $_GET werden in einem zentralen programmteil überprüft und per include eingefügt, dort sind auch noch andere System die sicherheit gewährleisten. Sicherheit ist hier kein Problem.

    hatte es nur von hand geschrieben, im programm selber ist es mit $_POST['a'] und es funktioniert ja ohne probleme mit der prüfung auf größer oder kleiner.

    Das feld ist int(11) in der Datenbank.
    Und das Programm funktioniert ja soweit ohne Fehler, nur das es in 10.000 aufrufen halt paar mal irgendwie mit ner leeren variablen durch kommt.

    function escapeforarray ($array)
      {
      foreach ($array as $a => $b)
        {
        if (is_array($array[$a]))
          {
           $array[$a] = escapeforarray ($array[$a]);
          }
        else
          {
          $array[$a] = mysql_real_escape_string($array[$a]);
          }
        }
      return $array;
      }
    $_GET = escapeforarray ($_GET);
    $_POST = escapeforarray ($_POST);



    Zuletzt modifiziert von TronKiller am 28.08.2008 - 19:36:07
    0 Mitglieder finden den Beitrag gut.
  9. #9
    User Pic
    TronKiller gelöschter User
    keiner mehr ne idee?
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu HTML, PHP, SQL,...

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten