Matze202
Erfahrenes Mitglied
EDIT3: Dies habe ich mir erstmal aus dem Kopf geschlagen:Hiho @all,
ich müsste zur Fehleranalyse den SQL-Code mir ausgeben lassen, der bei dem ausführen von dem execute(), an die Datenbank gesendet wird.
Ich hoffe, dass dies möglich ist, weil ich bisher nichts dazu gefunden habe.
Ich bräuchte dies, weil ich sicherstellen möchte, dass die bindParam(), welche ich generiert habe, auch richtig funktionieren, denn trotz der Eingabe von Daten, welche in der Datenbank vorhanden sind, bekomme ich kein Ergebnis, aber auch keine Fehlermeldung, sondern nur ein false, dass er nichts gefunden hat.
Gruß Matze202.
EDIT: Schon oft und jetzt auch wieder Stundenlange Suche und nix gefunden, aber nach dem Posten, bin ich auf den Beitrag von @Yaslaw gestoßen. Was ich erstmal austesten werde, aber wenn jemand noch andere Lösungen dazu kennt, wäre ich auch Dankbar, diese hier zu erfahren.
Link zum Beitrag von Yaslaw
EDIT2: Irgndwie gelingt es mir leider nicht, dieses in mein Datenbank-Objekt zu integrieren, dass die Objekt-Funktionen, welche direkt mit der Datenbank kommunizieren, den SQL-Code ausgeben.
Ich bin mir aber inzwischen fast sicher, dass irgendwas bei dem generieren der Platzhalter nicht korrekt ist, daher sende ich euch hier mal ein paar Funktionen.
Diese Funktion, soll den SQL-Code zusammensetzen und die dazugehörigen bindParam()-Funktionen generieren, sowie das absenden des SQL-Codes und ausgeben des Ergebnis.
PHP:
function load_string($table, $cell, $where = array('', '', 0, 0, 0)){
$sql = "SELECT :sc FROM :st WHERE ";
$sql .= self::check_where_for_sql($where);
$stmt = self::$_db->prepare($sql);
$table = self::$_prefix.$table;
$stmt->bindParam(":sc", $cell, self::pdo_param(0), 20);
$stmt->bindParam(":st", $table, self::pdo_param(0), 20);
$ar = self::check_bind_param($where);
foreach($ar as $v){
if(is_array($v)){
$a = $v[0];
$b = $v[1];
$c = $v[2];
$d = $v[3];
$e = $v[4];
$f = $v[5];
$stmt->bindParam($a, $b, self::pdo_param(0), 20);
if($f != 0){
$stmt->bindParam($c, $d, self::pdo_param($e), $f);
}else{
$stmt->bindParam($c, $d, self::pdo_param($e));
}
}
}
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
return $result[$cell];
}
var_dump($sql);
var_dump($v);SELECT :sc FROM :st WHERE :c = :w OR :c_ccccc = :w_wwwww
array (size=6)
0 => string ':c' (length=2)
1 => string 'key' (length=3)
2 => string ':w' (length=2)
3 => string 'title' (length=5)
4 => int 0
5 => int 5
array (size=6)
0 => string ':c_ccccc' (length=8)
1 => string 'id' (length=2)
2 => string ':w_wwwww' (length=8)
3 => int 1
4 => int 1
5 => int 11
Hier wird der Where-Teil des SQL-Code mit Platzhaltern zusammengestellt, die Funktion check_and_or() tut nur entsprechend das AND bzw. OR einfügen, daher gehe ich nicht auf diese Funktion ein, weil diese meiner Meinung nach, nichts mit dem Problem zu tun hat. Die Zeilen 7-16 dieser Funktion, sollen die Platzhalter generieren, wo ich denke, dass darin das Problem steckt. Ich habe die Platzhalter erst mit der Art :c0, :c5 etc. probiert, da ich bei meiner Recherche feststellte, dass diese sonst nie mit Zahlen versehen waren, habe ich es versucht, diese mit einem Unterstrich zu unterscheiden um besser eindeutig darzustellen, dass es keine doppelten geben kann, auch wenn aus endlos-tiefen Array´s generiert werden. Die Platzhalter mit dem Unterstrich und ohne Zahlen werden zwar sehr lang und sind genauso eindeutig, wie die mit Zahlen, aber es werden immer noch keine Einträge der Datenbank gefunden.
PHP:
private function check_where_for_sql($data, $c = 'c', $w = 'w'){
$sql = null;
for($i = 0; $i < count($data); $i++){
if(is_array($data[$i])){
$sql .= '('.self::check_where_for_sql($data, $c.'c', $w.'w').')';
}else{
$c_p = ':'.$c;
$w_p = ':'.$w;
if($i != 0){
$c_p .= '_';
$w_p .= '_';
for($a = 0; $a < $i; $a++){
$c_p .= 'c';
$w_p .= 'w';
}
}
$sql .= $c_p.' = '.$w_p;
$i = $i + 4;
if(isset($data[$i])){
$sql .= self::check_and_or($data[$i]);
}
}
}
return $sql;
}
Diese Funktion soll ebenso, wie die vorherige, die Platzhalter generieren, damit diese dann aber nicht wie bei der vorherigen in den SQL-Code, sondern in die bindParam()-Funktion eingefügt werden können.
PHP:
private function check_bind_param($data, $c = 'c', $w = 'w'){
$ar = array();
for($i = 0; $i < count($data); $i++){
if(is_array($data[$i])){
$ar[] = self::check_bind_param($data, $c.'c', $w.'w');
}else{
$c_p = ':'.$c;
$w_p = ':'.$w;
if($i != 0){
$c_p .= '_';
$w_p .= '_';
for($a = 0; $a < $i; $a++){
$c_p .= 'c';
$w_p .= 'w';
}
}
$ar[] = array($c_p, $data[$i], $w_p, $data[$i+1], $data[$i+2], $data[$i+3]);
$i = $i+4;
}
}
return $ar;
}
Diese Funktion, soll später eine komplette Liste, aller möglichen PDO:: PARAM... Vorgaben enthalten.
PHP:
private function pdo_param($i = 0){
switch($i){
case 0:
return PDO::PARAM_STR;
case 1:
return PDO::PARAM_INT;
}
}
Abfragen tu ich dies mit folgender Zeile zum testen:
PHP:
echo $db->load_string('_lang', 'value', array('key', 'title', 0, 5, 2, 'id', 1, 1, 11, 0));
Mir ist zwar klar, dass ich damit den SQL-Code stark eingrenze, aber ich finde diese Benutzung sehr handlich und bevor ich die Hintergründe weiter entwickel, werde ich natürlich noch weitere Funktionen, dieser Datenbankanbindung optimieren und erweitern.
Also es gibt momentan keine Fehlermeldungen, an die ich mich halten kann, ich habe aber die Platzhalter unter verdacht, dass die bindParam()-Funktion keinen Platz findet, wo die Daten eingefügt werden sollen, obwohl diese meiner Meinung nach eindeutig sind.
Ich hoffe, dass mir jetzt jemand helfen kann.
Zuletzt bearbeitet: