Select Multiple in DB

  • Guten Tag,

    ich habe eine Tabelle in meiner DB namens Städte. Ich kann per Select mehrere Städte auswählen und so ist dann mein Value z.b: "Berlin,Hannover,Hamburg".

    Wenn ich es in der DB jetzt einfüge wäre es so:

    id | city

    1 | Berlin,Hannover,Hamburg

    Ich möchte aber in meiner DB immer einzelne Städte speichern lassen die der Nutzer alle ausgewählt hat. z.b so:

    id | city

    1 | berlin

    2 | hannover

    3 | hamburg

    Wie funktioniert sowas?

    So ist bisher mein Code

    HTML

    Spoiler anzeigen
    HTML
    <form method="POST">
        <select name="cities" class="city" multiple>
            <option value="berlin">Berlin</option>
            <option value="hannover">Hannover</option>
            <option value="hamburg">Hamburg</option>
        </select>
    
        <button type="button" class="btn">Senden</button>
    </form>

    JS

    Spoiler anzeigen

    PHP (Ich hab jetzt mal den SQL Befehl usw weggelassen)

    Spoiler anzeigen
    PHP
    <?php
    echo $_POST['cities'];
    
    // GIBT Berlin,Hannover,Hamburg aus
    ?>
  • Ungetestet:

    Code
    $cities = array();
    
    foreach ($_POST['cities'] as $city)
       $cities[] = "'$city'";
       
    $query = "Select `dies`, 
                     `das`, 
                     `jenes` 
                from `tabelle` 
                where `city` in (" . implode(',', $cities) . ")";
  • Ungetestet:

    Code
    $cities = array();
    
    foreach ($_POST['cities'] as $city)
       $cities[] = "'$city'";
       
    $query = "Select `dies`, 
                     `das`, 
                     `jenes` 
                from `tabelle` 
                where `city` in (" . implode(',', $cities) . ")";

    Danke für die Hilfe erstmal,

    also er gibt mir keine Stadt aus. Hab mal var_dump($query) gemacht und bekam dies hier:

    string(87) "Select `city` from `dataset` where `city` in ('78267','52062')"

  • Das sind doch vermutlich Postleitzahlen, dann kann die Suche in der Tabellenspalte city ja auch nicht funktionieren.

    Wie sieht deine Tabelle genau aus?

    Ups hab ausversehen PLZ genommen, habs aber auch mit den Namen Versucht:

    string(90) "Select `city` from `dataset` where `city` in ('Berlin','Hamburg')"

    Wenn ich $row['city'] mache bekomme ich nur Berlin angezeigt.

    Wenn ich es mit while mache zeigt er mir mindestens 100x die Stadt Berlin an.

  • Zeige mal das aktuelle Formular und den aktuellen PHP-Teil

    PHP

    Spoiler anzeigen

    JS:

    Spoiler anzeigen
  • Was kommt dabei raus:

  • Was kommt dabei raus:

    Das hier:

    Spoiler anzeigen
    Code
    array(283) { [0]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [1]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [2]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [3]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [4]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [5]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [6]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [7]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [8]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [9]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [10]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [11]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [12]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [13]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [14]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [15]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [16]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [17]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [18]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [19]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [20]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [21]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [22]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [23]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [24]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [25]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [26]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [27]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [28]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [29]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [30]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [31]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [32]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [33]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [34]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [35]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [36]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [37]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [38]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [39]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [40]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [41]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [42]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [43]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [44]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [45]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [46]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [47]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [48]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [49]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [50]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [51]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [52]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [53]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [54]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [55]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [56]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [57]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [58]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [59]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [60]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [61]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [62]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [63]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [64]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [65]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [66]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [67]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [68]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [69]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [70]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [71]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [72]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [73]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [74]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [75]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [76]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [77]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [78]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [79]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [80]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [81]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [82]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [83]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [84]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [85]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [86]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [87]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [88]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [89]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [90]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [91]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [92]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [93]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [94]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [95]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [96]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [97]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [98]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [99]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [100]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [101]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [102]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [103]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [104]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [105]=> array(2) { ["city"]=> string(6) "Berlin" [0]=> string(6) "Berlin" } [106]=> array(2) { ["city"]=>

    Der code geht noch länger hab aber nur bisschen kopiert.

    Aber glaube habe mich falsch ausgedrückt oder du hast mich falsch verstanden^^

    ich wollte es so haben z.b

    $city = Berlin,Hamburg

    So

    Jetzt will ich 2x ein Insert durchführen da 2 städte ausgewählt sind:

    $insert = $pdo->prepare("INSERT INTO ´city` (city) VALUES (:city);");

    $insert->BindValue('city', $city) (SOllte jetzt berlin sein)

    $insert->execute();


    $insert = $pdo->prepare("INSERT INTO ´city` (city) VALUES (:city);");

    $insert->BindValue('city', $city) (Sollte jetzt Hamburg sein)

    $insert->execute();

    Wenn ich 3 Städte auswähle soll er 3x ein Insert machen. Ist das möglich?

  • Will nur erwähnen, wenn das Problem dann gelöst ist, bitte :platzhalter in der Query verwenden.

    Beipiele: https://stackoverflow.com/a/14767651/3411766

    PHP
    // eine möglichkeit:
    $placeholdersArray  = str_repeat('?,', count($cities) - 1) . '?'; // zB "?,?,?,?,?" bei 5 cities
    $sql = "Select `city` from `dataset` where `city` in ({$placeholdersArray})";
    $stm = $db->prepare($sql);
    $stm->execute($cities);
    $data = $stm->fetchAll();
  • ungetestet:

    PHP
    $aCitiesValues = array_map(
            function ( $city ) {
                return "('" . $city . "')";
            }
            , explode( ',', $_POST['city'] )
        );
    
    
    $oStmnt = $oPDO->prepare( 'insert into `city` (`city`) values ?' );
    $oStmnt->execute( [implode(',', $aCitiesValues)] );
  • ungetestet:

    PHP
    $aCitiesValues = array_map(
            function ( $city ) {
                return "('" . $city . "')";
            }
            , explode( ',', $_POST['city'] )
        );
    
    
    $oStmnt = $oPDO->prepare( 'insert into `city` (`city`) values ?' );
    $oStmnt->execute( [implode(',', $aCitiesValues)] );

    Hi,

    bekomme diese 2 Sachen ausgegeben wenn ich var_dump(implode(',', $aCitiesValues)) und var_dump($0Stmnt) eingebe

    string(4) "('')"


    object(PDOStatement)#2 (1) { ["queryString"]=> string(49) "insert into `follow_cities` (`cities`) values (?)" }

  • Code
    "INSERT INTO `city` (`city`) VALUES (?) (?) (?);"

    http://sandbox.onlinephpfunctions.com/code/4fdb0b302…2e770684908cb7c

  • Code
    "INSERT INTO `city` (`city`) VALUES (?) (?) (?);"

    http://sandbox.onlinephpfunctions.com/code/4fdb0b302…2e770684908cb7c

    Wieso bekomm ich diesen Fehler?

    Spoiler anzeigen
    Zitat


    Array ( [0] => 42000 [1] => 1064 [2] => You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '('Dresden') ('München')' at line 1 )

    Mein Code ist genau gleich außer das ich $_POST['city'] mit $data getauscht habe.

    Spoiler anzeigen

    Var_dump($sql)

    Spoiler anzeigen
    Zitat


    string(58) "INSERT INTO `follow_cities` (`cities`) VALUES (?) (?) (?);

  • Ich hab das Komma vergessen :D

    Opps :D

    SQL
    INSERT INTO `city` (`city`) VALUES (?), (?), (?);

    http://sandbox.onlinephpfunctions.com/code/52952256f…9c75a05981f7574

  • Ich hab das Komma vergessen :D

    Opps :D

    SQL
    INSERT INTO `city` (`city`) VALUES (?), (?), (?);

    http://sandbox.onlinephpfunctions.com/code/52952256f…9c75a05981f7574

    Hat perfekt geklappt danke dir^^. Kurze Frage noch, wenn ich mehrere Paramter einfügen möchte wie z.b die User_id noch, wie sollte es dann aussehen?

    PHP
    $params[] = $city;
    $params[] = $_SESSION['id']
    $values[] = "(?)";

    Finde es etwas kompliziert grade<.<

  • Nein. Dann würdest Du mehr Parameter übergeben, als Du Platzhalter angegeben hast.

    Das führt dann (zum Glück) zu einem Fehler (also Abbruch).

    Das hier könnte man dann machen:

    Oder (wenn es nicht auf Geschwindigkeit ankommt) man baut das Ganze dann übersichtlicher

    damit andere und man selbst später noch durchsieht

    PHP
    $data = [
        ['country' => 'DE', 'city' => 'Berlin'],
        ['country' => 'DE', 'city' => 'Dresden'],
        ['country' => 'DE', 'city' => 'München'],
    ];
    foreach ($data as $array) {
        $sql = "INSERT INTO `table_name` SET `country` = :country, `city` = :city;";
        $stmt = $pdo->prepare($sql);
        $stmt->execute($array);   
    }

Jetzt mitmachen!

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