php mysql problem

04/21/2012 18:02 SuGGl#1
Hallo, ich habe ein kleines problem mit mysql. Ich möchte aus einer Datenbank von einem benutzernamen die id bekommen danach mit der id in einer anderen tabelle alle einträge auslesen und in einer zahl darstellen lassen doch leider kommt immer der fehler:

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 '-players WHERE playername=SuGGl LIMIT 1' at line 1


Hier ist der Code:
PHP Code:
<?php
$user 
$_SESSION['name'];
$frage "SELECT playername, playerid FROM lb-players WHERE playername=$user LIMIT 1";
$ergebnis mysql_query($frage) or die(mysql_error());
$row mysql_fetch_object($ergebnis);
$id $row->playerid;

$frage "SELECT * FROM lb-world WHERE playerid LIKE '$id'";
$anz mysql_num_rows($frage) or die(mysql_error());
echo 
"Du hast ".$anz." Blöcke bearbeitet";
?>
Ich hoffe mir wird einer helfen :)

LG SuGGl
04/21/2012 18:45 .Acu³#2
[Only registered and activated users can see links. Click Here To Register...]

Beispiel:
PHP Code:
$queryMYSQL_QUERY(" SELECT tabelle1.*,tabelle2.alter,tabelle2.id FROM tabelle1 
LEFT JOIN tabelle2 ON (tabelle2.id = tabelle1.id) 
WHERE tabelle1.name='Hans' "
); 
Anpassen sollte ja selber klappen :)
04/21/2012 20:07 Project Rivalry#3
$frage = "SELECT playername, playerid FROM lb-players WHERE playername Like $user LIMIT 1";
04/23/2012 11:54 Mashkin#4
Quote:
Originally Posted by SuGGl View Post
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 '-players WHERE playername=SuGGl LIMIT 1' at line 1
PHP Code:
$frage "SELECT playername, playerid FROM lb-players WHERE playername=$user LIMIT 1"
Beim Vergleich des Namens muss die Variable "$user" in Anführungszeichen gesetzt werden:
Code:
"SELECT playername, playerid FROM lb-players WHERE playername=`$user` LIMIT 1"
Ein Tipp: Sieh zu, dass alle Variablen in einer Query ordentlich escaped sind. ;)

Und JOINs zu benutzen ist eleganter und auch technisch gesehen schneller.
04/23/2012 14:23 .Marcel'#5
Hier noch etwas Allgemeines zur Sicherheit:

Quote:
  • Escapen Sie jede nicht numerische Benutzereingabe, welcher zur Datenbank weitergereicht werden soll mit der jeweiligen datenbankspezifischen Escape-Funktion (z.B. mysql_real_escape_string(), sqlite_escape_string() usw.). Wenn keine datenbankspezifischen Escapemechanismen existieren können in der Regel (je nach Datenbanktyp) auch die Funktion addslashes() und addcslashes() von Nutzen sein. Siehe auch das erste Beispiel. Wie dieses Beispiel zeigt, sind in den statischen Teil der Abfrage eingebrachten Escapes nicht genug, und können leicht gehacked werden.
  • Geben Sie keinerlei datenbankspezifische Informationen aus, speziell über das Schema, egal wie (auf ehrliche oder unehrliche Weise). Siehe auch Fehlerbehandlung und Error Handling and Logging Functions.
  • Sie können stored procedures und vorher definierte Cursor verwenden, um den Datenzugriff zu abstrahieren, sodass Benutzer nicht direkt auf Tabellen oder Views zugreifen, aber diese Lösung hat andere Auswirkungen.
Quelle: [Only registered and activated users can see links. Click Here To Register...]
04/23/2012 15:53 NotEnoughForYou#6
Quote:
Originally Posted by GAMER19951 View Post
$frage = "SELECT playername, playerid FROM lb-players WHERE playername Like $user LIMIT 1";
bei nem like kann es dir passieren, dass du versehentlich nen falschen user selectest
04/23/2012 21:46 Project Rivalry#7
@ NotEnoughForYou o.O wieso wo ist den genau der unterschied.. wäre nett wen du mir das erklären könnteest interessiert mich jetzt =DD

mfg

gamer
04/23/2012 22:05 マルコ#8
LIKE = eng. "so wie", spielt also auf die Ähnlichkeit, nicht Gleichheit an.
Siehe
[Only registered and activated users can see links. Click Here To Register...]
04/25/2012 23:31 Whoknowsit#9
PHP Code:
<?php 
$result 
mysql_query("SELECT COUNT(*) FROM `lb-world` WHERE `playerid` = (SELECT `playerid FROM `lb-players` WHERE playername = '".$user."')") or die (mysql_error()); 
$anz mysql_result($result0); 
echo 
"Du hast ".$anz." Blöcke bearbeitet" 
?>
Ungetestet.