Seite 1 von 1
toArray aus db auslesen
Verfasst: Mi 3. Jun 2015, 21:00
von derju
Hi,
kann mir jemand einen Tipp geben, wo hier der Fehler ist?
Steh auf dem Schlauch.
Warning: "Database failure: 1064 (You have an error in your SQL syntax;...
Code: Alles auswählen
$getAssignment = "CMS_VALUE[1]";
$cfg = cRegistry::getConfig();
$db = cRegistry::getDb();
//$sql = $db->prepare("SELECT * FROM " . $cfg['sql']['sqlprefix'] . "_pi_portrait ORDER BY sort ASC ");
$sql = $db->prepare('SELECT * FROM `con_pi_portrait` WHERE idzustimmung = `CMS_VALUE[1]`');
//$sql = 'SELECT * FROM `:_pi_portrait` WHERE idzustimmung = :idzustimmung;';
$values = array(
'_pi_portrait' => $cfg['sql']['sqlprefix'] . "_pi_portrait",
'idzustimmung' => $getAssignment,
);
$sql = $db->prepare($sql, $values);
$db->query($sql);
if($db->nextRecord()) {
$value = $db->toArray();
}
// use smarty template to output header text
$tpl = cSmartyFrontend::getInstance();
$tpl->assign('portrait', $value);
$tpl->display('get.tpl');
LG - derJu
Re: toArray aus db auslesen
Verfasst: Mi 3. Jun 2015, 21:21
von homtata
vermutlich in der Zeile mit dem sql-Statement und den Hochkommata, die so nicht funktionieren dürften.
Ich würds anders versuchen:
Code: Alles auswählen
$sqlvalue = "CMS_VALUE[1]";
$sql = $db->prepare("SELECT * FROM con_pi_portrait WHERE idzustimmung = ".$sqlvalue);
Zumindest gehts in die Richtung.
Re: toArray aus db auslesen
Verfasst: Do 4. Jun 2015, 05:46
von derju
Leider nein.
Nur der Fehler hat sich geändert:
PHP Fatal error: Uncaught exception 'cDbException' with message 'Wrong number of parameter!
LG - derJu
Re: toArray aus db auslesen
Verfasst: Do 4. Jun 2015, 07:36
von Zuschauer
derju hat geschrieben:Code: Alles auswählen
$sql = $db->prepare('SELECT * FROM `con_pi_portrait` WHERE idzustimmung = `CMS_VALUE[1]`');
CMS_VALUE[1] wird hier als Text übergeben, nicht der Wert dessen.
Versuch mal folgendes:
Code: Alles auswählen
$sql = $db->prepare('SELECT * FROM `con_pi_portrait` WHERE idzustimmung = "' . "CMS_VALUE[1]" . '"');
homtata hat geschrieben:vermutlich in der Zeile mit dem sql-Statement und den Hochkommata, die so nicht funktionieren dürften.
Diese "Accents" sind ausdrücklich erwünscht, sie kennzeichnen Anfang und Ende des Namens (Datenbank, Tabelle oder Feld).
Lediglich bei der Übergabe des Textes müssen "normale" Anführungszeichen genutzt werden.
Gruß
Zuschauer
Re: toArray aus db auslesen
Verfasst: Do 4. Jun 2015, 08:24
von derju
Leider funktioniert es so auch nicht.
Ich habe jetzt eine Ausgabe ohne Fehlermeldung, nur leider wir hier nur utf-8 ausgegeben, keine Ahnung woher das kommt, der Inhalt aus der Datenbank ist nicht vorhanden:
Code: Alles auswählen
$getAssignment = "CMS_VALUE[1]";
$table = 'con_pi_portrait';
$cfg = cRegistry::getConfig();
$db = cRegistry::getDb();
$sql = $db->prepare('SELECT * FROM `%s` WHERE idzustimmung = %d', $table, $getAssignment);
$db->query($sql);
if($db->nextRecord()) {
$value = $db->toArray();
}
print_r($value);
LG - derJu
Re: toArray aus db auslesen
Verfasst: Do 4. Jun 2015, 08:37
von Faar
Die Contenido eigenen "CMS_VALUE[1]" sind nur Platzhalter und werden unter anderen an diesen Gänsefüßchen " " erkannt.
Das hier 'CMS_VALUE[1]' ist höchstens ein String der CMS_VALUE[1] lautet.
Grundsätzlich sollte man auch so nicht programmieren, finde ich:
Code: Alles auswählen
$sql = $db->prepare('SELECT * FROM `con_pi_portrait` WHERE idzustimmung = "' . "CMS_VALUE[1]" . '"');
Das sieht ähnlich aus wie:
Code: Alles auswählen
$sql = $db->prepare('SELECT * FROM `con_pi_portrait` WHERE idzustimmung = "' . "$_GET['value']" . '"');
Und der nächste lässt dann das
prepare weg.
Zudem muss man bei mySQL das mit den `und ' genau nehmen, also nach where id= folgt das ' und nicht das "
Das eine mal mag es gehen und woanders schon nicht mehr und oft liegt es nur an `und '
Das Beste wäre, man macht es so:
Weil eine ID ist meistens eine Integer Zahl und folglich hat man hier schon das mal gefiltert.
Und danach noch schauen, ob überhaupt ein Wert übergeben wurde:
Code: Alles auswählen
if($idzustimmung != ""){
$db->prepare("SELECT * FROM `con_pi_portrait` WHERE idzustimmung = '" . $idzustimmung . '" LIMIT 1");
}else{
//error handling
}
Der Konflikt mit den "" ist weg und die Reihenfolge ' und " stimmt.
Sorry

Re: toArray aus db auslesen
Verfasst: Do 4. Jun 2015, 08:42
von Faar
derju hat geschrieben:
Code: Alles auswählen
prepare('SELECT * FROM `%s` WHERE idzustimmung = %d', $table, $getAssignment);
LG - derJu
Achte mal auf diese ' bei der Where Anweisung, da steigt meistens die DB aus und sagt "nö!".
Code: Alles auswählen
prepare("SELECT * FROM `%s` WHERE idzustimmung = '%d'", $table, $getAssignment);
Und was genau prepare macht, sollte man auch noch schauen.
Also mal
und dann dieses SQL direkt in phpMyAdmin eingeben und schauen, was da raus kommt.
Re: toArray aus db auslesen
Verfasst: Do 4. Jun 2015, 09:07
von derju
Danke für eure Hilfe, ich habe es jetzt so gelöst:
Code: Alles auswählen
if($getAssignment != ""){
$sql = $db->prepare('SELECT * FROM `%s` WHERE idzustimmung = %d', $table, $getAssignment);
}else{
echo 'error handling';
}
$db->query($sql);
$value = array();
while ($db->nextRecord()) {
$value[] = $db->toArray();
}
echo '<pre>';
print_r($value);
echo '</pre>';
LG - derJu
Re: toArray aus db auslesen
Verfasst: Do 4. Jun 2015, 12:52
von Zuschauer
Faar hat geschrieben:Die Contenido eigenen "CMS_VALUE[1]" sind nur Platzhalter und werden unter anderen an diesen Gänsefüßchen " " erkannt.
Das hier 'CMS_VALUE[1]' ist höchstens ein String der CMS_VALUE[1] lautet.
Grundsätzlich sollte man auch so nicht programmieren, finde ich:
Code: Alles auswählen
$sql = $db->prepare('SELECT * FROM `con_pi_portrait` WHERE idzustimmung = "' . "CMS_VALUE[1]" . '"');
Das sieht ähnlich aus wie:
Code: Alles auswählen
$sql = $db->prepare('SELECT * FROM `con_pi_portrait` WHERE idzustimmung = "' . "$_GET['value']" . '"');
Und der nächste lässt dann das
prepare weg.
Zudem muss man bei mySQL das mit den `und ' genau nehmen, also nach where id= folgt das ' und nicht das "
Das eine mal mag es gehen und woanders schon nicht mehr und oft liegt es nur an `und '
Hast du mal genau hingesehen?
Wenn die SQL-Anweisung in ' steht, kommen die Texte darin in " eingeschlossen, so wie ich es gemacht habe.
Außerdem ist "CMS_VALUE[1]" richtig (hast du oben drüber sogar selbst bestätigt) und ist nicht wie "$_GET['value']".
In meine Anweisung steht (ohne das drum herum) korrekterweise:
Code: Alles auswählen
'SELECT * FROM `con_pi_portrait` WHERE idzustimmung = "' . "CMS_VALUE[1]" . '"'
Die SQL-Anweisung ist in ' eingeschlossen und wird für "CMS_VALUE[1]" kurz unterbrochen.
Wenn "CMS_VALUE[1]" den Wert
value hat, sieht die SQL-Anweisung dann so aus:
Code: Alles auswählen
'SELECT * FROM `con_pi_portrait` WHERE idzustimmung = "value"'
Absolut korrekt.
Gruß
Zuschauer
Re: toArray aus db auslesen
Verfasst: Do 4. Jun 2015, 21:42
von Faar
Ja, du hast auch recht.
In MySQL wird es halt immer so dargestellt, dass der Wert nach dem gesucht wird, immer nur in Hochkomma ' eingefasst wird und nicht in Gänsefüsschen ".
Aber wenn das auch funktioniert, solls halt so sein.
Ich hab halt schon schlechte Erfahrungen mit Abweichungen gemacht, manchmal lag es tatsächlich nur an den ' oder an den `
Wir (also unsere Entwicklergruppe) hatten manchmal lange nach dem Fehler gesucht und fehlende ` wurden je nach Feld-Namen verschmerzt aber die ' wurde oft von der DB angemeckert.
Ich finde es halt mit dem Zusammenhang von " und "CMS_VALUE[0]" in Kombination als eher Fehleranfällig, als wenn man es erst einmal einer Variablen übergibt und prüft.
Da hat man schnell mal NULL Wert oder etwas anderes drin und verheddert sich in den " ' Kombinationen.
Und wenn man sich das einmal angewöhnt, das immer direkt in das SQL hinein zu schreiben, dann macht man das automatisch auch dort, wo es kein prepare() hat und mal GET oder POST ist (Du sicher nicht, aber andere vielleicht).
Der Mensch ist meistens bequem und ein Gewohnheitstier.
