DB Abfrage gibt alle Daten zurück
Simon
- php
Hi,
bin langsam am verzweifeln:
Ich hab hier eine DB Abfrage:
<?php
require_once 'Configuration.php';
require_once 'MyDB.php';
$sql = "SELECT alias
FROM members
WHERE alias LIKE :username
LIMIT 10";
$stmt = MyDB::getInstance()->prepare($sql);
$stmt->execute(array(
':username' => "".$_REQUEST['sourceInput']."%",
));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo '<ul style="overflow:auto;">';
foreach($result as $row) {
printf('<li><b>%s</b>', $row['alias']);
}
echo '</ul>';
?>
die einfach ein paar Daten aus einer DB holt. Funktioniert auch, nur dass sie mir immer alle Daten anzeigt.Ich will aber nur die Daten die mit dem Buchstaben meiner Eingabe ($_REQUEST['sourceInput']) anfangen.
Ich hab auch schon "WHERE alias = :username" und andere Möglichkeiten mit dem % versucht, nur zeigt es mir dann gar nichts mehr an.
Hoffe mir kann da jemand helfen.
MfG
Simon
schau doch einfach mal im Handbuch nach. ;) Dort solltest Du drauf stoßen ...
Dort hab ich schon geschaut. Nur ein kleiner Tipp?
Hallo,
Dort hab ich schon geschaut. Nur ein kleiner Tipp?
Na dann ... versuch es mal mit einem String-Begrenzer (Stichwort: Quote, Anführungszeichen, ...). Will sagen, statt WHERE alias LIKE :username
(Du siehst schon beim Code-Highlighting, dass da etwas nicht stimmt) etwas wie WHERE alias LIKE '%imon%'
...
Moin!
Na dann ... versuch es mal mit einem String-Begrenzer (Stichwort: Quote, Anführungszeichen, ...). Will sagen, statt
WHERE alias LIKE :username
(Du siehst schon beim Code-Highlighting, dass da etwas nicht stimmt) etwas wieWHERE alias LIKE '%imon%'
...
Nee, luti, da übersiehst du die Tatsache, dass Simon hier Prepared Statements von PDO verwendet.
- Sven Rautenberg
Hallo,
Nee, luti, da übersiehst du die Tatsache, dass Simon hier Prepared Statements von PDO verwendet.
Ah, keine Ahnung ... Dann wäre es hilfreich, wenn Simon den String auslesen und hier posten würde, der an die DB geschickt wird. ;)
Grüße, luti
Ah, keine Ahnung ... Dann wäre es hilfreich, wenn Simon den String auslesen und hier posten würde, der an die DB geschickt wird. ;)
Es ist egal was ich eingebe. Ich bekomme als Ergebnis immer den ganzen DB Inhalt.
Hier mal meine Script, wobei ich nicht glaube dass das Problem bei denen liegt:
Configuration.php
<?php
final class Configuration {
const DB_HOST='localhost';
const DB_DATABASE='xxx';
const DB_PORT=3306;
const DB_USER='xxx';
const DB_PASSWORD='xxx';
}
?>
MyDb.php
<?php
require_once 'Configuration.php';
class MyDB {
private static $db;
private static $escapecounter = 0;
static public function getInstance() {
if(!self::$db) {
self::$db = new PDO(
'mysql:host='.Configuration::DB_HOST.';dbname='.Configuration::DB_DATABASE.';port='.Configuration::DB_PORT,
Configuration::DB_USER,
Configuration::DB_PASSWORD,
array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
)
);
}
return self::$db;
}
static public function implode(&$pdoparams, $arr) {
$tmp = array();
foreach($arr as $val) {
$key = ':implode'.self::$escapecounter++;
$pdoparams[$key] = $val;
$tmp[] = $key;
}
return implode(',', $tmp);
}
}
?>
und eben die search.php wo, glaub ich, das Problem liegt:
<?php
require_once 'Configuration.php';
require_once 'MyDB.php';
$sql = "SELECT alias
FROM members
WHERE alias LIKE :username
LIMIT 10";
$stmt = MyDB::getInstance()->prepare($sql);
$stmt->execute(array(
':username' => "".$_REQUEST['sourceInput']."%",
));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo '<ul style="overflow:auto;">';
foreach($result as $row) {
printf('<li><b>%s</b>', $row['alias']);
}
echo '</ul>';
?>
MfG
Simon
Hm, es wäre hilfreich, wenn Du irgendwo abfangen könntest, welche Anfrage (String) genau an die DB geschickt wird ... Ist das möglich? Ansonsten wären die Funktionen "prepare" und "execute" interessant(er) gewesen. Dort würde ich mal schauen, ob Du den "gebastelten" Aufruf nachvollziehen kannst.
Es ist egal was ich eingebe. Ich bekomme als Ergebnis immer den ganzen DB Inhalt.
Alles, oder nur die ersten 10 Einträge - bzw. ist der Inhalt nicht länger als 10 Zeilen? Denn mit limit 10
sollten in jedem Fall nicht mehr als 10 Ergebnisse geliefert werden.
Grüße, luti
Alles, oder nur die ersten 10 Einträge - bzw. ist der Inhalt nicht länger als 10 Zeilen? Denn mit
limit 10
sollten in jedem Fall nicht mehr als 10 Ergebnisse geliefert werden.
Nein nur die ersten 10, das ist anscheinend das einzige was funktioniert.
MfG
Simon
Nein nur die ersten 10, das ist anscheinend das einzige was funktioniert.
Na, dann liegt es wahrscheinlich an LIKE :username
.
Grüße, luti
Hi!
Ansonsten wären die Funktionen "prepare" und "execute" interessant(er) gewesen.
Das sind Methoden der PDO- beziehungsweise PDOStatement-Klasse. Die Funktionsweise ist im Handbuchkapitel zu PDO nachlesbar.
Lo!
Hallo,
Das sind Methoden der PDO- beziehungsweise PDOStatement-Klasse. Die Funktionsweise ist im Handbuchkapitel zu PDO nachlesbar.
Ah, und dass auch tatsächlich etwas in $_REQUEST['sourceInput']
drinne steht, da ist sich der Fragesteller sicher? ;)
Grüße, luti
Hi!
Ah, und dass auch tatsächlich etwas in
$_REQUEST['sourceInput']
drinne steht, da ist sich der Fragesteller sicher? ;)
So genau hast du bisher nicht gefragt und der OP wird deine Fragestellungen nicht darauf bezogen haben, genau davon eine Kontrollausgabe durchzuführen. Du wirst ihn eher mit deiner Wissenslücke um Prepared Statements verwirrt haben.
Lo!
Hallo,
So genau hast du bisher nicht gefragt und der OP wird deine Fragestellungen nicht darauf bezogen haben, genau davon eine Kontrollausgabe durchzuführen. Du wirst ihn eher mit deiner Wissenslücke um Prepared Statements verwirrt haben.
Jetzt habe ich auch Dich verwirrt ;| Die Idee, dass es daran liegen könnte, kam mir erst jetzt (nachdem ich etwas mehr Überblick habe) ... Ich kenne mich in der Tat mit PDO nicht aus und hatte gehofft, dass man die tatsächlich an die DB übermittelte Anfrage irgendwie (auf einfache Weise) ausgeben lassen kann. Und ich habe, BTW, immer noch keine Ahnung, ob das nicht doch geht ...
Grüße, luti
Hi!
Ich kenne mich in der Tat mit PDO nicht aus und hatte gehofft, dass man die tatsächlich an die DB übermittelte Anfrage irgendwie (auf einfache Weise) ausgeben lassen kann. Und ich habe, BTW, immer noch keine Ahnung, ob das nicht doch geht ...
Nein, denn das fertige Statement existiert nur im DBMS[*]. Das vorbereitete mit den Platzhaltern geht beim Prepare schon auf Reisen, die Werte kommen mit dem Execute hinterher.
[*] Vorausgesetzt, die PS werden von PDO für die DBMS, die das nicht selbst können, nur simuliert. Aber auch in dem Fall gibt PDO das fertige Statement nicht raus.
Lo!
Hi!
bin langsam am verzweifeln:
Das ist für das Problem belanglos.
':username' => "".$_REQUEST['sourceInput']."%",
Was ist der Inhalt von $_REQUEST['sourceInput']?
Zusatzfrage: Was soll der Leerstring vor dem Wert machen?
Lo!
':username' => "".$\_REQUEST['sourceInput']."%",
Was ist der Inhalt von $_REQUEST['sourceInput']?
Kommt von einem Inputfeld, wobei ich immer das selbe bekomme, egal was ich eingebe.
Zusatzfrage: Was soll der Leerstring vor dem Wert machen?
Eigentlich nicht, ist so reingerutscht.
MfG
Simon
Hi!
':username' => "".$\_REQUEST['sourceInput']."%",
Was ist der Inhalt von $_REQUEST['sourceInput']?
Kommt von einem Inputfeld, wobei ich immer das selbe bekomme, egal was ich eingebe.
Es ist egal, wo du glaubst, wo es herkommt und was du dort eingibst. Was steht wirklich drin? Lass dir das mit var_dump() anzeigen.
Lo!
Hi!
':username' => "".$\_REQUEST['sourceInput']."%",
Was ist der Inhalt von $_REQUEST['sourceInput']?
Kommt von einem Inputfeld, wobei ich immer das selbe bekomme, egal was ich eingebe.
Es ist egal, wo du glaubst, wo es herkommt und was du dort eingibst. Was steht wirklich drin? Lass dir das mit var_dump() anzeigen.
Richtig lesen müsste man können. "immer das selbe bekommen" was meinst du konkret damit?
Und warum nimmst du das unspezifische $_REQUEST und nicht eins der spezifischeren $_GET/$_POST/$_COOKIE?
Lo!
Hoi!
Was ist der Inhalt von $_REQUEST['sourceInput']?
Kommt von einem Inputfeld, wobei ich immer das selbe bekomme, egal was ich eingebe.
Und was?
Aber allein das 'dasselbe bekommen'[1] sollte Dich doch schon stutzig machen und legt die Vemutung nahe dass hier ein Fehler vorliegt.
[1]
der Rechtschreibrechthabungslaunebaer hierzu:
dasselbe / das gleiche
Hi an alle,
also hab meinen Fehler gefunden: es lag an $_REQUEST['sourceInput'].
Sie war auch immer leer, wegen einem Tippfehler von mir.
Nochmals danke an alle
MfG Simon