Fireplace

Website mit Datenbank anbindung

Poste mal dein neuen Quelltext.

Bei welcher Aktion sagt er: Es wurde kein Datensatz ausgewählt, diese Zeile finde ich in deinen Code leider nicht.

Dann ist mir aufgefallen, wenn noch nicht behoben:

$res = mysql_query("select `name`, `Vorname`, `Barcode`, `Guthaben` from personen");
Muss zu
$res = mysql_query("select `Name`, `Vorname`, `Barcode`, `Guthaben` from personen");
 
PHP:
<html>
<body>
<?php
if (isset($_POST["auswahl"]))
{
mysql_connect("","root");
mysql_select_db("benutzer");
$sqlab = "delete from personen where"
. " Barcode = " . $_POST["auswahl"];
mysql_query($sqlab);
$num = mysql_affected_rows();
if ($num>0)
echo "<p>Der Datensatz wurde gelöscht</p>";
else
echo "<p>Der Datensatz wurde nicht gelöscht</p>";
}
else
echo "<p>Es wurde kein Datensatz ausgewählt</p>";
?>
<p>Zurück zur <a href="erstellenff2.php">Auswahl</a></p>
</body>
</html>

das ist die Seite auf die Weiter geleitet wird, wenn ich den Ändern Button darauf Linke, klappts mit dem Löschen, anders jedoch nicht, da dann es wurde kein Datensatz ausgewählt kommt!

Danke für deinen Mühen sich da durch zu arbeiten!
 
Also es sieht so aus als wenn $_POST["auswahl"]; nicht existiert.

Wenn der Löschbutton immer noch so aussieht wie ich ihn rein geschrieben habe, geht es auch nicht!

Du musst schon "auswahl" mit geben.


Also kurz gesagt:

PHP:
//Neuer Button! 
echo '<form action="lösche.php" method="POST" name="löschen">'; 
echo '<input type="submit" value="Datensatz löschen" /></p></form>';

muss zu:

PHP:
//Neuer Button! 
echo '<form action="lösche.php" method="POST" name="löschen">'; 
$auswahl = $dsatz["Barcode"];
echo '<input type="hidden" name="delete" value="'.$auswahl.'">';
echo '<input type="submit" value="Datensatz löschen" /></p></form>';

Dann Ändere :

PHP:
if (isset($_POST["auswahl"])) 
{ 
mysql_connect("","root"); 
mysql_select_db("benutzer"); 
$sqlab = "delete from personen where" 
. " Barcode = " . $_POST["auswahl"];

zu:

PHP:
if (isset($_POST["delete"])) 
{ 
mysql_connect("","root"); 
mysql_select_db("benutzer"); 
$sqlab = "delete from personen where" 
. " Barcode = " . mysql_real_escape_string($_POST["delete"]);

Müsste dann gehen.

*edit*
Upps hatte sich ein kleiner Fehler eingeschlichen...
 
Zuletzt bearbeitet:
Er leite mich auf die richtige Seite Weiter, jedoch scheint er die Auswahl nicht mit zu übernehmen, es erschnit immer:

Es wurde kein Datensatz ausgewählt

Zurück zur Auswahl
 
Versuche doch mal heraus zu finden was gesendet wurde und welchen Fehler vill. der query ausspuckt!

Also:
var_dump oder print_r() benutzen für die Ausgabe POST

und unter dem query mal folgendes:

echo mysql_error();

Dann regeln sich Probleme fast von selbst wenn man sieht was gerade passiert!
 
print_r($_POST["delete"]) ;
gibt folgendes aus:

$auswahl

Der Datensatz wurde nicht gelöscht

echo mysql_error();

Unknown column '$auswahl' in 'where clause'

Zurück zur Auswahl
 
Poste mal dein Code so wie er die Fehler nun ausspuckt.
Also einmal die form und einmal den Code der das ganze verarbeitet.

Der Fehler sagt ganz klar was schief läuft!
 
PHP:
<?PHP
echo '<form action = "aendernffb.php" method = "post">';

 
mysql_connect("","root"); 
mysql_select_db("getraenke"); 
$res = mysql_query("select `Name`, `Barcode`, `Wert`, `Anzahl` from sorten"); 
$num = mysql_num_rows($res); 
// Tabellenbeginn 
echo "<table border='1'>"; 
// Überschrift 
echo "<tr> <td>Auswahl</td> <td>Name</td>"; 
echo "<td>Barcode</td> <td>Wert</td>"; 
echo "<td>Anzahl</td> </tr>"; 
while ($dsatz = mysql_fetch_assoc($res)) 
{ 
echo "<tr>"; 
echo "<td><input type='radio' name='auswahl'"; 
echo " value='" 
. $dsatz["Barcode"] . "' /></td>"; 
echo "<td>" . $dsatz["Name"] . "</td>"; 
echo "<td>" . $dsatz["Barcode"] . "</td>"; 
echo "<td>" . $dsatz["Wert"] . "</td>"; 
echo "<td>" . $dsatz["Anzahl"] . "</td>"; 
echo "</tr>"; 
} 
// Tabellenende 
echo "</table>"; 
echo '<p><input type="submit" value="Datensatz ändern" />';
//Datensatz Ändern ^^
echo '</form>';

//Neuer Button!
echo '<form action="loescheng.php" method="POST" name="löschen">'; 
echo '<input type="submit" value="Datensatz löschen" /></p>';
$auswahl = $dsatz["Barcode"];
echo '<input type="hidden" name="delete" value="$auswahl"></form>'
?>
PHP:
<?php
if (isset($_POST["delete"])) 
{ 
mysql_connect("","root"); 
mysql_select_db("getraenke"); 
$sqlab = "delete from sorten where" 
. " Barcode = " . mysql_real_escape_string($_POST["delete"]);  
mysql_query($sqlab);
$num = mysql_affected_rows();

print_r($_POST["delete"])   ;
if ($num>0)
echo "<p>Der Datensatz wurde gelöscht</p>";
else
echo "<p>Der Datensatz wurde nicht gelöscht</p>";
}
else
echo "<p>Es wurde kein Datensatz ausgewählt</p>";
echo mysql_error();
?>
<p>Zurück zur <a href="getraenkeerstellenff.php">Auswahl</a></p>

Da Bitte schön :)
 
Ersetze dein alten Löschbutton mit diesem hier:

PHP:
//Neuer Button!
echo '<form action="loescheng.php" method="POST" name="löschen">'; 
$auswahl = $dsatz["Barcode"];
echo '<input type="hidden" name="delete" value="'.$auswahl.'">;
echo '<input type="submit" value="Datensatz löschen" /></p>';
echo '</form>';
?>

Fehler lag an dem '..' deswegen hast Du in dem POST $auswahl gehabt! ;)

Und folge dessen kannst Du auch keine Abfrage in der DB machen weil es $auswahl logischer weise nicht gibt bzw. existiert! :)
 
PHP:
//Neuer Button!
echo '<form action="loescheng.php" method="POST" name="löschen">'; 
$auswahl = $dsatz["Barcode"];
echo '<input type="hidden" name="delete" value="'.$auswahl.'">';
echo '<input type="submit" value="Datensatz löschen" /></p>';
echo '</form>';
?>

Hab das jetzt ein gefügt, auch das ' noch, aber jetz kommt folgender fehler wenn ich das ausführe :-(

Der Datensatz wurde nicht gelöscht
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

Zurück zur Auswahl
 
Tausche mal die alte Abfrage gegen diese hier:


PHP:
$barcode = mysql_real_escape_string($_POST["delete"]);
$sqlab = "delete from sorten WHERE Barcode = '$barcode'";  
mysql_query($sqlab) or die(mysql_error());
 
Der Datensatz wurde nicht gelöscht

aber es kommen keine Fehler Meldungen mehr.
 
Guck Dir bitte nochmal an was geliefert wird.
(print_r($_POST["delete"]);

Und gleiche dass mal mit Deiner Datenbank ab, irgend wo hapert es noch.

Exportiere mal bitte deine Datenbank und stelle diese als Datei hier rein + Deine Dateien ( ohne mysql->passwort ) Ich lade das dann mal auf meinem Server und kann schneller schauen woran es hapert!
 
Es wird mir garkeine Fehlermeldung mehr geliefert :(

hab die 3 Dateien mal angehängt.

Vielen Dank für den ganzen Aufwand :)

Würd mich nacher über ne kurze Erklärung was ich für nen [denk] Fehler gemacht habe freuen, damit ichs beim nächsten mal hinbekomme.
 

Anhänge

Also so wie ich dass sehe, müssen paar Dinge umgebaut werden. Du kannst nicht außerhalb einer while schleife nicht auf den Datensatz zugreifen und diesen ohne weiteres einen Button zuweißen!

Das was Du machen kannst ist, die Tabelle umbauen und dann manuell per GET das löschen einleiten.

Ich werde dass mal eben schnell umbauen und paar Kommentare einbauen.

*edit*
Done

Im Anhang sind die Dateien.
 

Anhänge

Zuletzt bearbeitet:
Nach langer Zeit habe ich es endlich geschafft an dem Project weiter zu arbeiten. Vielen Dank nochmals für die bisherigen Hilfen. Ich habe es jetz hinbekommen Nutzer zu erstellen, zu löschen und zu bearbeiten.

Jetzt Arbeite ich grade an der Hauptseite die im moment wie folgt aussieht:
PHP:
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME'] ?>">
    <table>
        <tr>
            <td>Barcode</td>
            <td><input type name="bcb" /></td>
        </tr>

    </table>
    <input type="submit" value="Absenden"  />
</form>

<?php
// connect zur Mysql Datenbank
    require_once ('konfiguration.php');

    mysql_select_db( MYSQL_DATENBANK )
        or die("Auswahl der Datenbank fehlgeschlagen");


//prüft ob der eingegebene Barcode zu einem Nutzer gehört
$einlesen = mysql_query("SELECT COUNT(*) FROM nutzer WHERE barcode='".$_POST['bcb']."'");
$einzeln = mysql_fetch_row($einlesen);


//der Versuch das Guthaben als auf der ganzen Seite gültige Variable zu deklarieren
//$freund2 =mysql_query("select `guthaben` FROM `nutzer` WHERE barcode = '". $_POST["bcb"]."'");

//$guthaben2 = mysql_fetch_assoc($freund2);

//echo "Aktuelles Guthaben:  {$guthaben2['guthaben']} €";
//$guthaben= $guthaben2['guthaben'];


//prüft ob der Barcode ein Nutzer ist, wenn ja ausgabe von Name und Guthaben
if($einzeln[0]==1)
{
    echo "<p>Nutzer</p>";

    $sql = 'select * FROM `nutzer` WHERE Barcode = ' . $_POST["bcb"]. '';
    $abfrage = mysql_query($sql);

    while ($freund = mysql_fetch_assoc($abfrage)) {
        echo "Name: {$freund['vorname']} {$freund['nachname']} Guthaben: {$freund['guthaben']}€";

        $guthaben = $freund['guthaben'];
    }
}
// ansonsten Prüfen ob der Barcode zu einem Wert gehört 
else {
    echo "<p>kein Nutzer</p>";
    $einlesen2 = mysql_query("SELECT COUNT(*) FROM werte WHERE bcode='".$_POST['bcb']."'");
    $einzeln2 = mysql_fetch_row($einlesen2);

// wenn es ein Wert ist dann ausgeben
    if($einzeln2[0]==1)

    {   echo "<p>Getränk</p>";

    $sql1 = 'select * FROM `werte` WHERE bcode = ' . $_POST["bcb"]. '';
    $abfrage = mysql_query($sql1);

    while ($was = mysql_fetch_assoc($abfrage)) {
        echo "Getränk: {$was['bezeichnung']}  Kostet: {$was['wert']}€";
        
// versuch den wert vom Guthaben abzuziehen
        $guthaben = $guthaben - $was['wert'];
        echo "Neues Guthaben:  $guthaben";
    }
    }
// ausgaben wenn beides nicht zu trifft
    else echo "Nix is";
}
?>

Und zwar soll sie Folgendes Können:

Wenn ein Barcode vom Nutzer eingegebn wird, soll das von dem Nutzer gespeicherte Guthaben als Variable verfügbar geamcht werden, um davon bei der Eingabe von x Getränken, x * den wert abzuziehen und dann als neues Guthaben zuspeichern.

Es interessieren mich auch Anregungen, wie man es anders Lösen könnte als mit meinem Ansatz.
 
Hat dich schon jemand darauf hingewiesen, dass du hier eine riesige Sicherheitslücke schreibst? SQL Injection ist kein Pappenstiel.
 
Abgesehn von der SQL-Injection:

<form action="SELF"></form> ist das Selbe wie <form>

$guthaben ist nich definiert (Die Zeile ist auskommentiert).

Du speicherst das, was du abziehst vom Guthaben nicht in der DB ab.
Und diese Abfrage kann man dann auch zusammenfassen.

Das wäre dann
Code:
update nutzer 
set guthaben=guthaben-(
select sum(wert) from werte where bcode=:bcb
) 
where barcode=:bcb
Aber irgendwie ist die Logik da nicht klar. Du brauchst doch zwei Barcodes, einmal den für den Nutzer und einmal den fürs Getränk...
 
Danke schon mal für eure Antworten.

Was meinst du mit sql injection?

Kurz noch mal zur Beschreibung wie es funktionieren soll :

1. Barcode vom Nutzer wird gescannt
2. Barcode vom Getränk [bzw der Getränke] wird gescannt im selben Fenster

Der Wert des Getränks wird vom Guthaben des Nutzers abgezogen und soll dann als neues Guthaben gespeichert werden
 
SQL Injection ist einer der erfolgreichsten Angriffsvektoren gegen Webseiten. Überraschend viele Seiten, auch von namhaften Firmen (z.B. Sony), wurden und werden durch SQL Injection angegriffen. Dabei ist der Schutz dagegen eigentlich ganz einfach...

Das Problem ist z.B.:
PHP:
$einlesen = mysql_query("SELECT COUNT(*) FROM nutzer WHERE barcode='".$_POST['bcb']."'");

Du hast keinerlei Filter vor deiner POST-Variable. Wenn ich jetzt in $_POST['bcb'] nicht, wie du es erwartest, einen Barcode eintrage sondern einen entsprechend gewählten String kann ich sehr lustige Dinge mit deiner Datenbank anstellen.
Dein Query sieht im erwarteten Fall z.B. so aus:
Code:
SELECT COUNT(*) FROM nutzer WHERE barcode='1234'

Was passiert, wenn ich jetzt in dem POST einfach mal den String ';DELETE * FROM nutzer where id = '1 eintrage? Dein Query verändert sich zu:
Code:
SELECT COUNT(*) FROM nutzer WHERE barcode='';DELETE FROM nutzer where id = '1'

Siehst du, was ich hier gemeines gemacht hab? Und die Möglichkeiten sind noch viel größer. Über SQL Injection sowie die Reaktion des Servers kann man im günstigsten Fall alle Informationen der Datenbank erhalten und evtl. über die Execute-Befehle sogar auf die Shell zugreifen.

Ach ja, der einfachste Weg um Injections herum zu kommen ist die halbautomatische Filterung aller Werte. Kapsel jede Variable, deren Ursprung und Inhalt du nicht 100% genau kennst/vorhersagen kannst in mysql_real_escape_string()

Also z.B. mysql_real_escape_string($_POST['bcb']); wäre sicher vor Injections. Einfach um jedes GET oder POST so n Ding und du bist auf nem guten Weg.
 
Zuletzt bearbeitet:
Zurück
Oben