SQL BindParam Problem

  • Guten Tag,

    Brauche Hilfe bei einem Statement in Sql.
    Ich möchte es so einstellen das , wenn man ein Buchstaben eingibt z.B ( s ) , dass dann alle Emails die mit S anfangen angezeigt werden, Ohne BindParam funktoniert es möchte es aber mit BindParam machen wegen der Sicherheit. Wenn ich ein Buchstabe eingebe erscheint kein Datensatz.

    Spoiler anzeigen


    [PHP]
    <?php

    if('POST' == $_SERVER['REQUEST_METHOD']) {

    if(!isset($_POST['senden'])) {
    exit("Falsches Dokument");
    } else {

    include "sec/verbindung.inc.php";

    $sql = "SELECT id, email FROM daten WHERE email LIKE '?'%";
    $stmt = $verbindung->prepare($sql);
    $stmt->bindParam(1, htmlspecialchars($_POST['id-tag']));
    $stmt->execute();
    $arr = $stmt->fetchAll(PDO::FETCH_ASSOC);

    echo "<table border='1'>";
    echo "<tr><td> id</td> <td>Email</td></tr>";
    foreach ($arr as $data) {
    echo "<tr>";
    echo "<td>" . $data['id'] . "</td>";
    echo "<td>" . $data['email'] . "</td>";
    echo "</tr>";
    }
    echo "</table>";
    }
    }
    ?>
    [/PHP]

  • möchte es aber mit BindParam machen wegen der Sicherheit


    :thumbup: top!

    So sollte es laufen:


    Du kanns allerdings auch ohne bindParam:

    PHP
    $sql = "SELECT id, email FROM daten WHERE email LIKE :idtag"; // '?'% entfernt, placeholder hinzugefügt
    		// parameter array für ->execute() vorbereiten:
    		$para = array(
    			'idtag' => trim((string)$_POST['id-tag']) . '%'; 
    		);
    		$stmt = $verbindung->prepare($sql);  
    		$stmt->execute($para); // para mit an execute übergeben

    Was passiert hier:
    Du übergibst (ob per bindParam oder execute($para)) einen String myemail@or.whatever%.
    PDO setzt diesen String "intern" so ein:

    SQL
    SELECT id, email FROM daten WHERE email LIKE '%myemail@or.whatever'


    Warum?
    Weil alles, was Du per execute($para) oder bindParam($key, $val, PDO::PARAM_STR) übergibst, zwischen Anführungszeichen gesetzt wird -- also al String eingesetzt wird.
    Will man etwas anderes als einen String in die Query schreiben lassen (zB für LIMIT :x :y), dann muss man
    - bindParam() nutzen
    - und bindParam() sagen, was genau man vorhat: zB bindParam($key, $val, PDO::PARAM_INT) -- einen int

    Hoffe das hilft.

    2 Mal editiert, zuletzt von cottton (8. November 2015 um 15:53)

  • Vielen Dank! Aber deine Version hat irgendwo ein Haken. Er zeigt mir keine Datensätze an.

    Einmal editiert, zuletzt von strong97 (8. November 2015 um 01:39)

  • Vorweg: sorry, hab nen Fehler drin gehabt: das % muss am Ende angehangen werden -- so wie Du es richtig gemacht hast =)

    Du prüfst, ob der Wert in $arr größer ist, als 0. 8|
    Willst aber sicherlich prüfen, ob:

    PHP
    if(count($arr) < 1) { echo "Kein Datensatz gefunden"; } // weniger als 1


    Oder aber noch einfacher:

    PHP
    if(empty$arr)) { echo "Kein Datensatz gefunden"; } // empty wäre zB NULL, 0, '', array(), ...
  • @cotton: Habe es auch so gemacht bevor du es am Ende schon gesetzt hast (Das Prozentzeichen). Trotzdem zeigt er mir immer noch keine Datensätze an.
    Danke für die Hilfe der Abfrage ob ein Datensatz gefunden wurde oder nicht. :)

  • wolf das geht auch ohne =)
    Hat den Vorteil, dass man bei dynamischen Scripten den $key nicht immer mit einem : verbinden muss (':' . $key).

    @string97 dann sieh am besten mal nach, was für Queries am Server ankommen.
    Query log in table:

    http://stackoverflow.com/a/14404000/3411766

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!