PHP mysql_affected_rows - erhalte bei update immer -1

bifi_berlin

New member
3 Februar 2013
1
0
Newbie:
Ich erhalte bei diesem Sript immer den Rükgabewert -1, obwohl ein Update in der Datenbank erfolgreich durchgeführt wurde. Kann mir jmd auf die Sprünge helfen?


PHP:
if (true===isset($_POST['update']))
    {
        $update= $_POST['update'];
        foreach($update as $ausgabe){
            echo 'Feld'.$ausgabe;
            
            }
             $id= $_POST['id'];
                echo 'ID: '.$id;
                 $wert = $_POST['wert'];
                   $wert = ucwords($wert);
        
                
                $update = mysql_query("UPDATE buchung_bg SET $ausgabe = '$wert'  WHERE buchungs_id ='$id' ");
                 mysql_query ($update);
                   $num=mysql_affected_rows($db);
                         if($num<0)
                          echo $num.'Der Datensatz wurde geändert';

                             else
                              echo $num.'Der Datensatz wurde nicht geändert';
  }
 
Zuletzt bearbeitet von einem Moderator:
Was soll $db denn sein? Die Variable ist ungesetzt und somit schlägt der Aufruf fehl.
 
thehacker hat dir schon den richtigen tipp gegeben


hier nochmal was allgemeines

PHP:
if (true===isset($_POST['update']))

es sollte auch

PHP:
if (isset($_POST['update']))

reichen

da isset() true oder false zurückliefert
 
Sollte hier vielleicht noch darauf hingewiesen werden, dass dein Script ungeprüfte POST-Variablen in ein SQL-Query schreibt?

Sowas stellt eine gravierende Sicherheitslücke dar. Am besten immer zumindest mit

Code:
$foo = mysql_real_escape_string($foo)
 
Zuletzt bearbeitet:
Noch besser: Gleich auf die mysql_*-Funktionen verzichten und PDO und Prepared Statementes nutzen. Da ist es dann relativ wumpe, woher die Daten kommen und was drin steht. :sing:

Wird hier viel zu selten erwähnt - deshalb nutze ich den Moment mal.
 
Ich würde ja eher behaupten, was dem MySQL-Query sein "mysql_real_escape_string()", ist dem PDO sein "bindParam()"

von daher Jacke wie Hose.
 
Ich würde ja eher behaupten, was dem MySQL-Query sein "mysql_real_escape_string()", ist dem PDO sein "bindParam()"

von daher Jacke wie Hose.
Das ist Schwachsinn. Bei Prepared Statements werden der Datenbank Query und Daten seperat übermittelt. Dadurch ist es unmöglich, eine SQL Injection herbeizuführen, während es auch mit mysql_real_escape_string() immer noch schlupflöcher gibt, wenn man es nicht richtig verwendet.
 
... und eben jene Trennung nimmt bindParam() vor, wenn ich den ersten Kommentar des Links von tleilax richtig interpretiere. Wenn man diese nicht benutzt, ist eine SQL-Injection immer noch möglich. Wenn das nicht stimmen sollte, kannst du es ja auf der PHP-Seite posten. Mal sehen, was du als Antwort erhältst.
 
Mal sehen, was du als Antwort erhältst.

Das empfehle ich dir eher :roll:

Mit mysql_real_escape_string() wird dein Wert in dem Query String eingesetzt, allerdings escaped. Es wird nicht seperat zum Server übertragen, wie es bei Prepared Statements der Fall wäre. Beispiel?

PHP:
$query = 'SELECT * FROM users WHERE id=' . mysql_real_escape_string($_GET['id']);
$result = mysql_query($query);

Hier wurde nicht bedacht, dass eine ID, also ein Integer, gefragt ist. Demnach müssen keine Anführungszeichen gesetzt werden und ich kann problemlos ein "0 OR 1=1" übergeben und schon habe ich alle User und nicht nur einen User. (simples Beispiel, viele andere Spielereien wären möglich)

Dies ist mit den Prepared Statements so nicht möglich, weil die Daten vom MySQL-Server gar nicht erst ausgeführt werden.

PHP:
$query = $db->prepare('SELECT * FROM users WHERE id=?');
$query->execute(array($_GET['id']));
(Funktionen vllt nich ganz richtig, habs grad nich im Kopf.. aber Prinzip dürfte klar sein)
 
Also gut, da du zu faul bist auf den Link zu klicken, kopiere ich den entsprechenden Teil mal hier rein:

Code:
<?php
$a=new PDO("mysql:host=localhost;dbname=database;","root","");
$b=$a->prepare("UPDATE `users` SET user='$var'");
$b->execute();
?>

In dem Code könnte über die Variable $var eine SQL-Injection ausgelöst werden.
Du siehst, man kann auch PDO falsch einsetzen.

In beiden Fällen gilt: richtig angewendet ist es sicher.
 
Natürlich, wenn man gar nichts verwendet ist das alles für die Tonne. Du hast aber gesagt, es ist scheiß egal (so interpretiere ich dein Jacke wie Hose in dem Zusammenhang), ob man mysql_real_escape_string() oder Prepared Statements nutzt. Und das ist es eben nicht!
 
icon14.gif