toArray aus db auslesen

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
derju
Beiträge: 301
Registriert: Do 15. Jan 2009, 09:00
Kontaktdaten:

toArray aus db auslesen

Beitrag 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
Contenido 4.8.20 | Contenido 4.9.12
homtata
Beiträge: 1145
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: toArray aus db auslesen

Beitrag 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.
derju
Beiträge: 301
Registriert: Do 15. Jan 2009, 09:00
Kontaktdaten:

Re: toArray aus db auslesen

Beitrag 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
Contenido 4.8.20 | Contenido 4.9.12
Zuschauer
Beiträge: 141
Registriert: Do 5. Dez 2013, 08:57
Kontaktdaten:

Re: toArray aus db auslesen

Beitrag 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
derju
Beiträge: 301
Registriert: Do 15. Jan 2009, 09:00
Kontaktdaten:

Re: toArray aus db auslesen

Beitrag 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
Contenido 4.8.20 | Contenido 4.9.12
Faar
Beiträge: 1951
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Hat sich bedankt: 15 Mal
Kontaktdaten:

Re: toArray aus db auslesen

Beitrag 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:

Code: Alles auswählen

$idzustimmung = intval("CMS_VALUE[1]");
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 :roll:
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Faar
Beiträge: 1951
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Hat sich bedankt: 15 Mal
Kontaktdaten:

Re: toArray aus db auslesen

Beitrag 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

Code: Alles auswählen

echo $sql;
und dann dieses SQL direkt in phpMyAdmin eingeben und schauen, was da raus kommt.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
derju
Beiträge: 301
Registriert: Do 15. Jan 2009, 09:00
Kontaktdaten:

Re: toArray aus db auslesen

Beitrag 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
Contenido 4.8.20 | Contenido 4.9.12
Zuschauer
Beiträge: 141
Registriert: Do 5. Dez 2013, 08:57
Kontaktdaten:

Re: toArray aus db auslesen

Beitrag 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
Faar
Beiträge: 1951
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Hat sich bedankt: 15 Mal
Kontaktdaten:

Re: toArray aus db auslesen

Beitrag 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.
:|
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Antworten