Kleines SQL Syntax Problem

hazzilein

Lieutenant
Registriert
Mai 2008
Beiträge
692
Hallo, ich komme einfach nicht auf eine Lösung wo hier der Fehler liegt. Das mit den Variablen hab ich so gemacht weil ich dachte vielleicht geht es wenn ich den Wert aus einem Forumlar erst in eine Variable übergebe, ich weiß dass ich direkt das $_POST reinschreiben könnte in den Inser Befehl. Wäre nett wenn kurz jemand helfen könnte.

Es geht auch nicht wenn ich die Values in '....' stecke

$name = $_POST['vorname'];

$alter = $_POST['alter'];

$groesse = $_POST['groesse'];

$haarfarbe = $_POST['haarfarbe'];

$cool = $_POST['istcool'];


$con = mysql_connect("localhost","felix","luftballon");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("kontakte", $con);

$sql="INSERT INTO tab_freunde (Name, Alter, Groesse, Haarfarbe, cool)
VALUES
($name, $alter, $groesse, $haarfarbe, $cool)";


if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "1 person added";

mysql_close($con);

Fehlermeldung:

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 'Alter, Groesse, Haarfarbe, cool) VALUES (, , , , )' at line 1
 
strings (variablen müssen immer in singlequotes -> '

ausserdem würde stringverkettung das ganze übersichtlicher machen:
$sql="INSERT INTO tab_freunde (Name, Alter, Groesse, Haarfarbe, cool)
VALUES
('".$name."','".$alter."', '".$groesse."','". $haarfarbe."','".$cool."')";
 
Hi hazzilein,

welche Typen haben denn die Attribute in der Datenbank?

VARCHARs gehören in '
also wenn alles VARCHARs sind, dann sollte es folgendermaßen lauten:

$sql="INSERT INTO tab_freunde (Name, Alter, Groesse, Haarfarbe, cool)
VALUES ('$name', '$alter', '$groesse', '$haarfarbe', '$cool')";

lg dia
 
Also ich hab jetz alles auf Varchars umgestellt in der Datenbank. Ich probiers mal mit Hochkommata jetzt.

EDIT:

Also in der Tabelle ist für alles varchar eingetragen und ich habs jetzt mit den Anführungszeichen probiert, kommt aber dieser Fehler.

Error: 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 'Alter, Groesse, Haarfarbe, cool) VALUES ('', '', '', '', '')' at line 1

Ich komme garnicht zu meinem Formular um etwas einzugeben, es kommt schon vorher der Fehler.
Tut mir leid ist das erste mal dass ich etwas mit SQL probiere.
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    54,9 KB · Aufrufe: 248
Zuletzt bearbeitet:
dia schrieb:
Hi hazzilein,

welche Typen haben denn die Attribute in der Datenbank?

VARCHARs gehören in '
also wenn alles VARCHARs sind, dann sollte es folgendermaßen lauten:

$sql="INSERT INTO tab_freunde (Name, Alter, Groesse, Haarfarbe, cool)
VALUES ('$name', '$alter', '$groesse', '$haarfarbe', '$cool')";

lg dia

das würde nicht funktionieren. Php parset keine Werte in Singlequotes... Er würde dann $cool in die Datenbank schreiben. Deswegen Stringverkettung ;)

Edit: Seh grad dass der String mit " anfängt. Bin mir grad sicher ob das klappt, glaube aber schon. sauber ist es auf jedenfall nicht
 
Zuletzt bearbeitet:
$sql="INSERT INTO tab_freunde (Name, Alter, Groesse, Haarfarbe, cool)
VALUES
('".$name."','".$alter."', '".$groesse."','". $haarfarbe."','".$cool."')";

geht auch nicht. Leider :/

Also normalerweise interpretiert ja PHP nur Variablen wenn das ganze in "..." steht oder?


Hab oben ein Bild von der Tabelle gepostet.


Wenn ich einfach irgendwas eingebe kommt folgender Fehler.

Error: 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 'Alter, Groesse, Haarfarbe, cool) VALUES ('234','fsfs', 'asdfasfd','asdsfa','1'' at line 1

CODE:

$sql="INSERT INTO tab_freunde (Name, Alter, Groesse, Haarfarbe, cool)
VALUES
('234','fsfs', 'asdfasfd','asdsfa','1')";
 
Zuletzt bearbeitet:
ach verdammt !!! es liegt am ALTER ! das ist ein mysql befehl... versuchs mir backticks um tabelle und felder... also

`Name`,`Alter` .... :D
 
:D moment mal versuchen ;)

Jetzt gehts, vielen vielen Dank ;)

Ich glaub ich werd die nächste Stunde sicher noch einmal mit einem Problem daherkommen ;)

mfg


EDIT: Komisch jetz kann ich zwar schön auf absenden klicken usw. aber er fügt mir das ganze immer mehrmals ein.

Hab jetzt schon eine Bedingung rumgemacht jetz fügt ers nurnoch 2 mal ein ;)

if(!empty($_POST['vorname']) && !empty($_POST['groesse']) && !empty($_POST['alter'])){
$name = $_POST['vorname'];

$alter = $_POST['alter'];

$groesse = $_POST['groesse'];

$haarfarbe = $_POST['haarfarbe'];

$cool = $_POST['istcool'];


$con = mysql_connect("localhost","felix","luftballon");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("kontakte", $con);

$sql="INSERT INTO tab_freunde (`Name`, `Alter`, `Groesse`, `Haarfarbe`, `cool`)
VALUES
('".$name."','".$alter."', '".$groesse."','". $haarfarbe."','".$cool."')";

if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "1 person added";

mysql_close($con);
}
 
Zuletzt bearbeitet:
@vegeta: natürlich geht auch dies. aber "alter" ist nicht das einzige problem gewesen. abgesehen davon bin ich dafür, dass man demjenigen erklärt warum fehler auftreten damit dieser dazu lernt :-)

@hazzi: bitte schön
 
Hm fügt mir den ganzen Spaß noch immer zweimal ein, das wird jetz wieder ne Fehlersucherei...
 
also das liegt nicht an dem oben geposteten code. du drückst wohl f5 oder sowas? ansonsten poste mal das ganze script
 
Also das Script ist reines Chaos ;)

Es gibt ein Formular in dem eben die Daten eingegeben werden, die Daten werden in einer CSV Datei gespeichert und wenn man auf "Geburtstage Anzeigen" klickt werden die Daten wieder aus der Datei geholt, in ein Array zerlegt und in einer Tabelle wiedergegeben.

Das ganze soll jetzt auf SQL umgestellt werden und nichtmehr mit der Datei laufen.

Naja hier mal die 3 Dateien, eigentlich möcht ich euch ja das nicht antun ;)

Das was ich da mit dem Konstruktorzeug gemacht hab weiß ich selber nichtmehr genau, ist schon ne Weile her.

INDEX.PHP

Code:
<?php
require("freund.php");

// Heredoc
$str = <<<HEREDOC
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
 <b>Meine Geburtstagsliste</b><br><br>
 <a href="form.php?typ=1">Geburtstagsliste anzeigen</a><br>
 <a href="form.php?typ=2">Geburtstage hinzuf&uuml;gen</a><br>
 <a href="form.php?typ=3">Liste l&ouml;schen</a><br><br>
HEREDOC;
echo $str;

// Heredoc und Variable um Geb hinzuzufuegen
$add = <<<ADD
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body>
  <form action="form.php" method="post">
    Bitte alle Daten angeben, sonst keine &Uuml;bernahme in die Datenbank!<br>
    Name:<br/>
    <input type="text" name="vorname"><br><br>
    Alter:<br/>
    <input type="text" name="alter"><br/>
    Gr&ouml;&szlig;e:<br/>
    <input type="text" name="groesse"><br/><br/>
    Haarfarbe:<br/>
   <select name="haarfarbe">
   <option value="feiges Stueck">(Keine Eingabe)</option>
   <option value="blond">blond</option>
   <option value="dunkelblond">dunkelblond</option>
   <option value="braunhaarig">braunhaarig</option>
   <option value="schwarzhaarig">schwarzhaarig</option>
   <option value="rothaarig">rothaarig</option>
   </select><br><br>
    <input type="checkbox" name="istcool" value="ist cool">Falls er oder sie cool ist bitte anklicken</input>
    <br><br>
    <input type="submit" value="Absenden">
    </form>
</body>
</html>
ADD;
/*
$idhelper = md5(uniqid(rand(),true));
*/

idHelperFkt();
addString();
loescheZeile();
freundErstellen();

// Geburtstage anzeigen 
if($_GET['typ']==1){
  freundeAnzeigen();
}
freundTesten();

// Geburtstage hinzufuegen
if($_GET['typ']==2){
echo $add;
}
// Geburtstage loeschen
if($_GET['typ']==3){
dateiInhaltLoeschen();
echo ('gel&ouml;scht!');
}
  // Bottom.html auf jeder Seite einbinden
  require("bottom.html");
?>

DATEIHANDLER.PHP


Code:
<?php
// Datei Inhalt komplett löschen
function dateiInhaltLoeschen2(){
$h = fopen("freunde.csv", "w");
if ($h)
{
  $zeile = "0;Name;Alter;Groesse;Haarfarbe;Ist cool?;loeschen";
  

  fputs($h, $zeile);
    fclose($h);
}
}

// Freund testen

function freundTesten2(){
if(!empty($_POST['vorname']) && !empty($_POST['groesse']) && !empty($_POST['alter'])){
  $h = fopen("freunde.csv", "a");
  if ($h)
  {
    fputs($h, freundErstellen());
    fclose($h);
  }
}
}

// freunde anzeigen
function freundeAnzeigen2(){
$h = fopen("freunde.csv", "r");
  if ($h)
  {
    while (!feof($h))
      {
        $zeile = fgets($h);
    $arr = explode(";", $zeile);
    $friend[] = $arr;
    $tabelle = "<table border='1'>";
    foreach ($friend as $schluessel => $wert)
    {
    $tabelle .="<tr>";
// Tabelle generieren
        foreach ($wert as $s2)
        {
      $tabelle .= "<td>$s2</td>";
        }
      $tabelle .="</tr>";
     }
    }
 fclose($h);
 $tabelle .= "</table>";
 echo $tabelle;
  }
}


// id helper funktion
function idHelperFkt2(){
$file1 = fopen("freunde.csv", "r");
if($file1){
      while(!feof($file1)){
        $zeile1 = fgets($file1);
        $freunde1[]=explode(";", $zeile1);
      }
      $id = 0;    
      foreach ($freunde1 as $f => $freund1){
      $idhelper = $freund1[0];
      $idhelper++;
      }
  fclose($file1);
}
return $idhelper;
}


// Zeile löschen

function loescheZeile2(){
if($_GET['id']){
$loeschen = $_GET['id'];

$d1 = fopen("freunde.csv", "r");
$d2 = fopen("freunde2.csv", "w");

// wenn beide erfolgreich geoeffnet wurden

if($d1 && $d2)
{
    while(!feof($d1))
    {
      // Zeile holen
      $zeile = fgets($d1); 
      $zarray = explode(";" , $zeile);
      if($zarray[0] != $loeschen)
        {
        fputs($d2, $zeile);      
        }
    }
    fclose($d1);
    fclose($d2);
    // kopieren der neuen datei nach freunde.csv
    // sichern von freunde.csv
    copy("freunde.csv", "freunde-sicher.csv");
    copy("freunde2.csv", "freunde.csv");
    unlink("freunde2.csv"); // loesche test2.csv
}
}
}
?>

FREUNDE.PHP (Datenverarbeitung)

Code:
<?php
require("dateihandler.php");
// Datei Inhalt komplett löschen
function dateiInhaltLoeschen(){
   dateiInhaltloeschen2();
}

// freund erstellen
function freundErstellen(){

if(!empty($_POST['vorname']) && !empty($_POST['groesse']) && !empty($_POST['alter'])){
$name = $_POST['vorname'];

$alter = $_POST['alter'];

$groesse = $_POST['groesse'];

$haarfarbe = $_POST['haarfarbe'];

$cool = $_POST['istcool'];


$con = mysql_connect("localhost","felix","luftballon");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("kontakte", $con);

$sql="INSERT INTO tab_freunde (`Name`, `Alter`, `Groesse`, `Haarfarbe`, `cool`)
VALUES
('".$_POST['vorname']."','".$_POST['alter']."', '".$_POST['groesse']."','". $_POST['haarfarbe']."','".$_POST['istcool']."')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "1 person added";

mysql_close($con);

}

// Auch noch in die CSV Datei speichern

$freunde[] = new Freund(idHelperFkt(),$_POST['vorname'],$_POST['alter'],$_POST['groesse'],$_POST['haarfarbe'],$_POST['istcool'],addString());
// aufruf der Methode zur erstellung der Zeile die in die Datei geschrieben wird
for($i = 0; $i < count($freunde); $i++){
  $zeile .= ("\n" .$freunde[$i] -> alsCSVZeile());
}
return $zeile;
}

// id helper
function idHelperFkt(){
  return idHelperFkt2();
  
}
// lösche zeile
function loescheZeile(){
  loescheZeile2();
}

// Freund testen
function freundTesten(){
   freundTesten2();
}

// Funktion zum String adden, idhelper
function addString(){
$idhelper2 = idHelperFkt();
$str2 = <<<HEREDOC
<a href="form.php?id=$idhelper2">loeschen</a> 
HEREDOC;
return $str2;
}




// Freunde anzeigen
function freundeAnzeigen(){
 freundeAnzeigen2();
}
// Klasse Freund
// Klassen Name immer gross
class Person{
protected $name;
  public function __construct($n){
    $this->name = $n;
  }
  public function setName($var){
  $this -> name = $var;
  }  
  public function getName(){
    return $this -> name;
  }
}

// Klasse in Datei speichern mit gleichem Namen, also freund.php
class Freund extends Person{
  // Eigenschaften mit Modifizierer public, private, protected
  public static $zaehler = 0;
  // Klassenvariable, also auch auf objekte der klasse
  //private $id = 0;
  private $alter;
  private $groesse;
  private $haarfarbe;
  private $cool;
  private $id1;
  private $url;
  
  
  // Konstruktor
  public function __construct($id,$n,$a,$g=NULL,$h=NULL,$c=NULL,$u){
  //Konstruktor Perosn aufrufen
  // Person parent von Freund
  parent::__construct($n);
  self::$zaehler++; // variable oben, self bezeichnet klasse
  //$this -> name = $n;
  $this -> id1 = $id;
  $this -> alter = $a;
  $this -> groesse = $g;
  $this -> haarfarbe = $h;
  $this -> cool = $c;
  $this -> url = $u;
  }
  
  
  public function alsCSVZeile(){
  return 
         
         $this -> id1 . ";" .
         $this -> name . ";" .
         $this -> alter . ";" . 
         $this -> groesse . ";" . 
         $this -> haarfarbe . ";" .
         $this -> cool . ";" .
         $this -> url;  // beendet return
         
  }
}


?>

DB.PHP (Verbindung zur Datenbank, könnte ich weglassen weil ich sowieso in der INSERT funktion darauf connecte)

Code:
<?php
define('DBCONNECTION', 'mysql:host=localhost;dbname=kontakte');
define('DBUSER', 'felix');
define('DBPASSWD', 'luftballon');


function createDBConnection()
{
    try
    {
        return new PDO(DBCONNECTION, DBUSER, DBPASSWD);
    }
    catch (PDOException $e) {
        echo("PDO Error: " . $e->getMessage());
    }
}
?>
 

Anhänge

Zuletzt bearbeitet:
Hallo,

ich habe mir die Skripte nur flüchtig angeschaut.
Allerdings denke ich , dass die PHP-Einstellung "register_globals" auf On steht, was grundsätzlich schlecht ist. Dadurch wird der DB-Eintrag u.U. 2x geschrieben. Lösche die Variablen (auch die $_POST[...]) nach dem Insert (bzw. Schreiben in die CSV-Datei) mit "unset".
Eine bessere Prüfung der übergebenen Variablen wäre auch nicht schlecht (SQL-Injection möglich!).

Viele Grüße
 
Moment ich muss schnell schaun wie die Syntax für den unset Befehl ist dann versuche ich es mal.

Ok ist ja kein komplizierter Befehl ;)

Also das hier hinzufügen unter dem "in die Datei und Datenbank schreiben"

unset($_POST['vorname']);
unset($_POST['alter']);
unset($_POST['groesse']);
unset($_POST['haarfarbe']);
unset($_POST['istcool']);


EDIT: Ok super danke für die Antwort, wieso ist das jetzt genau so?
 
Zuletzt bearbeitet:
Also ich bin in PHP total neu :( und total überfordert mit den ganzen Möglichkeiten die man hat, programmiere nämlich erst seit knapp nem Jahr, und erst seit 2 Monaten PHP ab und zu ...

Also hab jetzt sogar schon ne Ausgabe der SQL Datenbank, zwar nicht mit einer schönen tabellen Form sondern so:

Name, Groesse, Haarfarbe, cool?
Tim >> Rue Jean Paul >> Paris >> ist cool
Hancook >> Avenue >> Marseille >> 0
asdf >> asdf >> blond >> ist cool
fafs >> 1,89 >> feiges Stueck >>
erwin >> 234 >> feiges Stueck >>

aber ist ja egal ;) Das würd jetzt wieder ewig dauern bis ich was finde wie ichs in ne gescheite Tabelle reinbekomme. Jetzt muss ich mich drum kümmern dass ich für jede Zeile einen Link habe mit dem ich sie löschen kann :)
Ergänzung ()

Wieso kann ich die komplette Tabelle so nicht löschen? Angeblich Syntax Error bei Zeile 11, also in der Zeile DELETE FROM tab_freunde;


function dateiInhaltLoeschen2(){
$con = mysql_connect("localhost","felix","luftballon");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("kontakte", $con);
DELETE FROM tab_freunde;
mysql_close($con);
}
Ergänzung ()

So geht es, aber löschen tut er nichts ;)

mysql_select_db("kontakte", $con);
$sql="DELETE FROM tab_freunde";
mysql_close($con);
}
 
hazzilein schrieb:
Ergänzung ()

So geht es, aber löschen tut er nichts ;)

mysql_select_db("kontakte", $con);
$sql="DELETE FROM tab_freunde";
mysql_close($con);
}

Du weißt das Query nur einer Variablen zu und schließt die Verbindung.
 
Ok schlecht ;) Aber bei den anderen Sachen hab ichs ja auch immer so gemacht ... Und er hat den Befehl ausgeführt
Ergänzung ()

Ok habs gelöst.

Weiß zwar nicht was das macht aber damit gehts =/

if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "geloescht";
 
DjNDB schrieb:
Du weißt das Query nur einer Variablen zu und schließt die Verbindung.

siehe sein post.

aber zu deiner hilfe:

"if (!mysql_query($sql,$con))" senden $sql an die mysql datenbank über die verbindung $con. das ! fragt ab, ob dabei fehler auftreten. Wenn ja ....

"die('Error: ' . mysql_error());" wird das script abgebrochen (die()) und die fehlermeldung geschreiben.

das mysql_query MUSS also hinter jeden query, da sonst nix an die datenbank geschickt wird.
 
Zurück
Oben