Simon: DB Abfrage gibt alle Daten zurück

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

  1. Hallo,

    schau doch einfach mal im Handbuch nach. ;) Dort solltest Du drauf stoßen ...

    Grüße, luti

    1. schau doch einfach mal im Handbuch nach. ;) Dort solltest Du drauf stoßen ...

      Dort hab ich schon geschaut. Nur ein kleiner Tipp?

      1. 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%' ...

        1. 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 wie WHERE alias LIKE '%imon%' ...

          Nee, luti, da übersiehst du die Tatsache, dass Simon hier Prepared Statements von PDO verwendet.

          - Sven Rautenberg

          1. 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

            1. 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

              1. 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

                1. 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

                  1. Nein nur die ersten 10, das ist anscheinend das einzige was funktioniert.

                    Na, dann liegt es wahrscheinlich an LIKE :username.

                    Grüße, luti

                2. 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!

                  1. 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

                    1. 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!

                      1. 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

                        1. 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!

  2. 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!

    1. ':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

      1. 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!

        1. 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!

      2. 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

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
  3. 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