Yadgar: MySQL 5: mysql_real_escape_string bei LIKE nicht möglich?

Hi(gh)!

Folgende Aufgabenstellung: Eine Funktion makelist($year) soll aus einer Datenbank Titellisten von Radiosendungen erstellen, jeweils eine Liste pro Jahr. Ursprünglich hatte ich für jedes Jahr ein eigenes PHP-Skript, was natürlich auf die Dauer umständlich zu warten ist... dort sah der Aufruf der Sendedaten z. B. (für das Jahr 1984) folgendermaßen aus:

  
SELECT Datum FROM sendung WHERE Datum LIKE '1984%';  

Wenn ich diesen Aufruf parametrisieren will, dachte ich mir, müsste der Code in PHP ungefähr so aussehen:

  
$like = $year."%";  
$query = "SELECT Datum FROM Sendung WHERE Datum LIKE '".mysql_real_escape_string($like)."'";  

...aber der Bildschirm bleibt leer! Wieso funktioniert das nicht? Wie müsste man so etwas stattdessen schreiben?

Bis bald im Khyberspace!

Yadgar

Now playing: Distant Calls (Twice A Man)

  1. Relevant ist was in $query steht. Das wäre?
    Einen Datumswert sollte man als Datum speichern, ist das bei dir der Fall? Dann ist das vielleicht nicht die richtige Zugriffsart. Ich würde etwas der Art verwenden:
    WHERE datum >= '1984-01-01' AND datum < '1985-01-01'

    1. Hi(gh)!

      Relevant ist was in $query steht. Das wäre?
      Einen Datumswert sollte man als Datum speichern, ist das bei dir der Fall?

      In der Datenbank ist sendung.Datum vom Typ DATE, das ist nicht das Problem...

      Ich würde etwas der Art verwenden:
      WHERE datum >= '1984-01-01' AND datum < '1985-01-01'

      Das hilft mir aber nicht bei der Beantwortung meiner Frage! Es geht ja darum, die Literale durch Variablen zu ersetzen - und das geht mit mysql_real_escape_string nicht!

      Die Literalversion mit ...LIKE '1984%' funktioniert prima - ich will aber an dieser Stelle eine Variable verwenden, verstehst du?

      Bis bald im Khyberspace!

      Yadgar

    2. Tach!

      WHERE datum >= '1984-01-01' AND datum < '1985-01-01'

      Für Spalten vom Typ DATE/DATETIME: WHERE YEAR(datum) = 1984
      Die 1984 kann auch in Anführungszeichen stehen, wenn man die Usereingabe mit mysql_real_escape_string() statt intval() sichern nöchte.

      dedlfix.

  2. Hallo,

    klar geht das - offenbar läuft in deinem Code aber was falsch.
    Was exakt steht denn in dieser Variable drin?

    var_dump($like);

    1. Hi,

      klar geht das - offenbar läuft in deinem Code aber was falsch.
      Was exakt steht denn in dieser Variable drin?

      var_dump($like);

      noch interessanter wär die Variable $query. Dann würde man auch direkt das Problem sehen; falls es die Query ist.

      Ich kann es gerade nicht ausprobieren, aber das '%' würde ich nicht durch die mysql_real_escape_string-Funktion schicken.

      Grüße

      • Steffen
      1. Tach!

        Ich kann es gerade nicht ausprobieren, aber das '%' würde ich nicht durch die mysql_real_escape_string-Funktion schicken.

        Ich auch nicht mehr, aber das nur, weil die mysql_*-Funktionen mittlerweile vom Aussterben bedroht sind. Ansonsten gibt es damit kein Problem diesbezüglich. Das Zeichen wird wie jedes andere Zeichen ohne Sonderbedeutung einfach durchgelassen. Was problematisch werden kann: ein % (und ein _ ebenso) kann auch in einer Benutzereingabe stehen und verfälscht oder erweitert damit das Suchmuster. Das ist in dem Fall ohne negative Folgen, da ist halt nur das Suchergebnis anders. Wenn es aber kritischer ist, das Sucmuster nicht durch die Usereingabe zu verändern, dann muss man sich um eine Entsorgung aus der Usereingabe oder eine fachgerechte Maskierung kümmern. Dazu gibt es keine vorgefertigte Funktion, man muss da zu Fuß Escape-Zeichen davorsetzen (siehe MySQL-Handbuch zu LIKE).

        dedlfix.