Ergebnis 1 bis 20 von 20

Thema: LIKE %Suchbegriff% mit Zend_Db_Select

  1. #1
    Erfahrener Benutzer Avatar von mahok
    Registriert seit
    29.11.2007
    Beiträge
    172
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard LIKE %Suchbegriff% mit Zend_Db_Select

    Hi,

    ich bastel gerade an einer kleinen Anwendung mit ZF und das Manual konnte mir nicht wirklich weiterhelfen...

    Ich will ein SELECT-Statement mit LIKE über Zend_Db_Select erstellen:
    Code:
    SELECT * FROM users WHERE description LIKE %suchbegriff%
    Muss ich das LIKE %suchbegriff% in die where()-Methode von Zend_Db-Select einbauen oder gibt es dafür eine extra Methode?

  2. #2
    Moderator Avatar von thomas
    Registriert seit
    16.12.2006
    Beiträge
    1.349
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    PHP-Code:
    $db->where("description like %begriff"); 
    sollte funktionieren.
    Mfg
    Thomas Weidner
    I18N Team Leader, Zend Framework
    Wir schwarzen Schafe sind die heimlichen Herrscher der Welt... unser schwarzer Humor ist unsere beste Waffe
    www.thomasweidner.com

  3. #3
    Erfahrener Benutzer Avatar von mahok
    Registriert seit
    29.11.2007
    Beiträge
    172
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Zitat Zitat von thomas Beitrag anzeigen
    PHP-Code:
    $db->where("description like %begriff"); 
    sollte funktionieren.
    dachte ich auch, aber ich krieg einen Fehler:
    SQLSTATE[42000]: Syntax error or access violation: 1064
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%begriff%)' at line 5

    Mein Code sieht wie folgt aus:
    PHP-Code:
    $db Zend_Db::factory('Pdo_MySql'$params);
    $select $db->select()
        ->
    from($table["name"])
        ->
    where('title LIKE%' $keywords '%');
    $result $select->query()->fetchAll();
    $db->closeConnection(); 
    Hab die Zeile mit ->where() schon mehrfach verändert, aber jedesmal kam obiger Fehler

    edit: Also ohne % klappt es, aber das LIKE wirkt dann wie ein "=".
    PHP-Code:
    ->where('title LIKE ?'$keywords); 
    Geändert von mahok (30.12.2007 um 15:13 Uhr) Grund: Fehlerquelle gefunden

  4. #4
    Erfahrener Benutzer
    Registriert seit
    28.12.2006
    Beiträge
    9.966
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Code:
    'title LIKE%' . $keywords . '%'
    Freizeichen nach LIKE Hat das einen bestimmten Grund, dass deine Variable "keywords" (Mehrzahl) heißt? In der Fehlermeldung ist nur von "%begriff% (Einzahl) die Rede ^^

  5. #5
    Erfahrener Benutzer
    Registriert seit
    26.12.2006
    Ort
    Hürth
    Beiträge
    722
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Die Fehlermeldung "access violation" kommt mir da etwas merkwürdig vor. Wie wäre es mit Anführungsstrichen um das Suchwort? Also:

    Code:
    SELECT * FROM table WHERE column LIKE "%mahok%"
    Habs bei MySQL auch noch nie gesehen, dass man das Suchwort von LIKE nicht in Anführungsstrichen stecken kann.

  6. #6
    Erfahrener Benutzer
    Registriert seit
    28.12.2006
    Beiträge
    9.966
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Zitat Zitat von jpieper Beitrag anzeigen
    Die Fehlermeldung "access violation" kommt mir da etwas merkwürdig vor. Wie wäre es mit Anführungsstrichen um das Suchwort? Also:

    Code:
    SELECT * FROM table WHERE column LIKE "%mahok%"
    Habs bei MySQL auch noch nie gesehen, dass man das Suchwort von LIKE nicht in Anführungsstrichen stecken kann.
    SQLSTATE[42000]: Syntax error or access violation: 1064
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%begriff%)' at line 5
    Ausserdem seh ich im Original weder Anführungszeichen noch Hochkomma

  7. #7
    Erfahrener Benutzer Avatar von mahok
    Registriert seit
    29.11.2007
    Beiträge
    172
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    ah danke, die Anführungszeichen warens

    Die Variable heißt $keywords, weil das Suchfeld so heißt, werde mit regexp das ganze noch zu einzelnen Suchbegriffen auseinanderbauen.

    Das fehlende Freizeichen nach LIKE war nur ein Tippfehler...

    Hier nochmal der korrigierte Code:
    PHP-Code:
    $select $db->select()
        ->
    from($table["name"])
        ->
    where('title LIKE "%' $keywords '%"');
    $result $select->query()->fetchAll(); 
    Das Hochkomma stammt übrigens von select(), wenn man sich das Objekt mit Zend_Debug::dump() ausgeben lässt, kann man das gut sehen
    Geändert von mahok (30.12.2007 um 16:36 Uhr) Grund: Einrückung beim PHP-Code korrigiert

  8. #8
    Erfahrener Benutzer
    Registriert seit
    12.04.2007
    Beiträge
    1.045
    Thanks
    0
    Thanked 3 Times in 2 Posts

    Standard

    Und das quoten der Inhalte von $keywords nicht vergessen (Stichwort SQL-Injections).

    Gruß
    Remi

  9. #9
    Erfahrener Benutzer
    Registriert seit
    26.12.2006
    Ort
    Hürth
    Beiträge
    722
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    *mir-auf-die-schulter-klopf*


  10. #10
    Moderator Avatar von thomas
    Registriert seit
    16.12.2006
    Beiträge
    1.349
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Btw:
    PHP-Code:
    ->where('title LIKE%' $keywords '%'); 
    kann nicht funktionieren...

    Wenn Du Late Binding verwenden willst dann geht das so wie ich es gezeigt habe...

    PHP-Code:
    $db Zend_Db::factory('Pdo_MySql'$params);
    $select $db->select()
        ->
    from($table["name"])
        ->
    where('title LIKE %keywords');
    $result $select->query()->fetch(array('keywords' => $keywords));
    $db->closeConnection(); 
    Oder Du hast nur eine Variable dann geht's mit Instant Binding besser...

    PHP-Code:
    $db Zend_Db::factory('Pdo_MySql'$params);
    $select $db->select()
        ->
    from($table["name"])
        ->
    where('title LIKE ?'$keywords);
    $result $select->query()->fetch();
    $db->closeConnection(); 
    Wenn Du Queries selbst zusammenastelst mußt Du unbedingt das Quoting auch selber machen...

    PHP-Code:
        ->where('title LIKE ' $db->quote('%' $keywords '%')); 
    Aber das wurde ja eh schon erwähnt.
    Ein Blink in die Doku hilft auch immer weiter.
    Mfg
    Thomas Weidner
    I18N Team Leader, Zend Framework
    Wir schwarzen Schafe sind die heimlichen Herrscher der Welt... unser schwarzer Humor ist unsere beste Waffe
    www.thomasweidner.com

  11. #11
    Erfahrener Benutzer
    Registriert seit
    26.12.2006
    Ort
    Hürth
    Beiträge
    722
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Escaped quote() eigentlich auch?

  12. #12
    Moderator Avatar von Bleistift
    Registriert seit
    14.12.2006
    Ort
    Zürich (Schweiz)
    Beiträge
    1.580
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Wieso "auch"...? Was macht quote sonst noch?
    Moderator
    Kein ZF-Support via Foren-PN

  13. #13
    Erfahrener Benutzer Avatar von deetee
    Registriert seit
    17.12.2007
    Beiträge
    1.459
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    ->quote() escaped und quoted, anders als die PHP Funktion mysql_real_escape_string(), die nur escaped. Hab ich gerade eben im zend webinar aufgeschnappt

  14. #14
    Neuer Benutzer
    Registriert seit
    02.08.2012
    Beiträge
    1
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Ist das Problem noch aktuell?
    Hatte dieselbe Situation und habe sie so gelöst:

    $select = $this->getDbTable()->getAdapter()->select()
    ->from(
    'zielplanung',
    array(
    "berater",
    "timestamp",
    "summe" => new Zend_Db_Expr("SUM(anzahl)")
    )
    )
    ->where(
    "typ = 'units'"
    )
    ->group('berater');

    if(!is_null($whereYear)) {
    $select->where(
    "datum LIKE ?", $whereYear."%"
    );
    }
    Sprich das % Zeichen an das Argument angefügt.
    Ergibt mir folgenden SQL:
    SELECT `zielplanung`.`berater`, `zielplanung`.`timestamp`, SUM(anzahl) AS `summe` FROM `zielplanung` WHERE (typ = 'units') AND (datum LIKE '2012%')

  15. #15
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    4.481
    Thanks
    1
    Thanked 125 Times in 121 Posts

    Standard

    Willkommen im Forum!
    Zitat Zitat von fare31key Beitrag anzeigen
    Ist das Problem noch aktuell?
    Dieser „Thread“ ist nun wirklich richtig alt.
    Zitat Zitat von fare31key Beitrag anzeigen
    Sprich das % Zeichen an das Argument angefügt.
    Du hast „quoteInto()“ vergessen!

    PS: Verwende doch bitte die entsprechenden „BBCodes“ für Codeauszüge, dann lassen sich deine Beispiel auch besser lesen. Danke!
    Zum Zend Framework stehen jedem folgende fünf Quellen zum Nachschlagen zur Verfügung:

  16. #16
    Benutzer
    Registriert seit
    05.12.2011
    Beiträge
    59
    Thanks
    3
    Thanked 0 Times in 0 Posts

    Standard

    bin auch gerade dabei meine Queries zu optimieren, aber irgendwie bin ich gerade verwirrt

    PHP-Code:
    ->where('lcase(e.eventName) LIKE ?'strtolower($eventName) . '%'
    quoted jetzt wirklich oder muss ich da nochmal selbst nachholfen? also z.B.

    PHP-Code:
    ->where('lcase(e.eventName) LIKE '$this->_db->quote(strtolower($eventName) . '%')) 
    oder sind beide Ansätze gar äquivalent?

    danke für die Hilfe

  17. #17
    Erfahrener Benutzer
    Registriert seit
    08.08.2011
    Beiträge
    466
    Thanks
    6
    Thanked 34 Times in 33 Posts

    Standard

    Probier's aus? Die Antwort ist dann „Ja”

  18. The Following User Says Thank You to crash For This Useful Post:

    zowo (17.09.2012)

  19. #18
    Benutzer
    Registriert seit
    05.12.2011
    Beiträge
    59
    Thanks
    3
    Thanked 0 Times in 0 Posts

    Standard

    nochmal eine Frage, habe nun folgendes Szenario, dass der Suchbegriff in zwei Spalten zwei verschiedener Tabellen abgefragt werden soll, dazu hab ich versucht das Query wie folgt anzupassen

    PHP-Code:
    ->where('(lcase(e.locationName) LIKE ?'strtolower($params['locationName']) . '% '.'OR (lcase(l.locationAddress) LIKE ?'strtolower($params['locationName']) . '%)'
    aber das Problem liegt anscheinend bei der Verbindung mit OR, auch ein ORWHERE würde in diesem Fall nicht funktionieren, da ich noch mehrere WEHRE-Klauseln verwende und sonst immer alle Bedingungen ODER die jeweilige Klausel oben angewandt wird.

    Hat jemand eine Idee wie ich die Bedingungen in einer WHERE-Anweisung unterbringe?

  20. #19
    Erfahrener Benutzer
    Registriert seit
    08.08.2011
    Beiträge
    466
    Thanks
    6
    Thanked 34 Times in 33 Posts

    Standard

    PHP-Code:
    ->where('(lcase(e.locationName) LIKE ?'strtolower($params['locationName']) . '%')
    ->
    orWhere('lcase(l.locationAddress) LIKE ?)'strtolower($params['locationName']) . '%'
    Die beiden Klammern sind entscheidend.

  21. The Following User Says Thank You to crash For This Useful Post:

    zowo (17.09.2012)

  22. #20
    Benutzer
    Registriert seit
    05.12.2011
    Beiträge
    59
    Thanks
    3
    Thanked 0 Times in 0 Posts

    Standard

    sauber danke jz funktioniert das Query!

Ähnliche Themen

  1. Zend_Db_Select. Warum?
    Von Daniel84 im Forum DB
    Antworten: 21
    Letzter Beitrag: 18.02.2009, 15:20
  2. Zend_Db_Select: Where mit Wildcard
    Von chrigu im Forum DB
    Antworten: 4
    Letzter Beitrag: 18.09.2007, 13:54
  3. Zend_Db_Select
    Von ShoX im Forum DB
    Antworten: 2
    Letzter Beitrag: 15.03.2007, 21:05

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •