PHP MySQL WHERE IN

lockcat

Erfahrenes Mitglied
Hallo liebe leser,

ich habe folgendes denkproblem ich würde gerne in einer Datenbankspalte ein wert suchen bsp

user hat ein wert von: Tom,Anna,Max

in einer abfrage will ich prüfen ob ein wert vorhanden ist und eine ausgabe machen. WHERE halt.

PHP:
$benutzername = "Tom,Anna";
$db_array = $database->runSQLQuery("SELECT * FROM news WHERE user IN ($benutzername) ");
        while($row = mysql_fetch_object($db_array)) {

echo $row->text;
}

Dieser text sollte halt nur für Tom und Anna zu lesen sein - leider gibt er mir keine ausgabe.

Kann mir jemand ein tipp geben?

lieben Gruß
 
Hallo,

du solltest normalerweise so etwas wie "a,b,c" nicht in einer Spalte speichern. Erstelle lieber einen neue (one-to-many) Tabelle.
Ansonsten kannst du für dein aktuelles DB-Layout INSTR verwenden:

SQL:
-- [benutzername] ersetzt du logischerweise mit PHP
SELECT * FROM news WHERE INSTR(user, '[benutzername]') <> 0
 
Denke, es ist das hier gemeint:

PHP:
$benutzername = 'Tom,Anna';

$tmp = explode(',', $benutzername);

foreach ($tmp as &$item) {
    // "escape" durch passende Escaping-Funktion des DB-Adapters ersetzen
    // (z. B. mysqli_real_escape_string())
    $item = escape(trim($item));
}
unset($item);

$whereInPart = "'" . implode("', '", $tmp) . "'";

$query = sprintf("SELECT * FROM news WHERE user IN (%s)", $whereInPart);

var_dump($query);
    // string(48) "SELECT * FROM news WHERE user IN ('Tom', 'Anna')"

Die mysql-Erweiterung von PHP ist veraltet. Nutze mysqli oder PDO.

- http://php-de.github.io/jumpto/faq/#deprecated-mysql (derzeit ganz unten auf der Seite)

Die User sollten aber eigentlich in einer eigenen Tabelle stehen und per Fremdschlüssel referenziert werden. Siehe: Normalisierung, Redundanzvermeidung.

- http://reeg.junetz.de/DSP/node7.html#SECTION03340000000000000000
 
@ComFreek
Besser mit FIND_IN_SET() als mit INSTR().
Ansonsten wird Hans inder Liste 'Peter, Hans-Ueli' ebenfalls gefunden
Code:
-- [benutzername] ersetzt du logischerweise mit PHP
SELECT * FROM news WHERE FIND_IN_SET(USER, '[benutzername]') <> 0

Die Version von mermshaus finde ich aber die schönste
 
Zuletzt bearbeitet von einem Moderator:
Zurück