2016-07-11 8 views
0

Ich habe eine Datenbanktabelle mit der folgenden Struktur. id Spalte wird später hinzugefügt. So sind alle id Zellen leer.Aktualisieren einer Datenbankspalte (vertikal) mit einem Array

id | song | album | artist 
----------------------------- 
    | song1 | alb1 | art1 
    | song2 | alb2 | art2 
    | song3 | alb3 | art3 
    | song4 | alb4 | art4 
    | song5 | alb5 | art5 

Ich habe ein Array, das die id Werte für die Tabelle hält. Ich werde die Tabelle (die ID-Spalte) mit den Werten im Array aktualisieren. Beispiel:

$array = [ 
    "C45Rm3fLGn", 
    "ocIik81up2", 
    "IcuSn9T77y", 
    "tJv7AbF53r", 
    "a9eZ6xYM5Y", 
]; 

Diese Elemente sind eindeutige zufällige Zeichenfolgen.

Wie soll ich fortfahren? Ich denke darüber nach, das Array zu wiederholen und UPDATE für jedes Element zu verwenden.

$array = [ 
    "C45Rm3fLGn", 
    "ocIik81up2", 
    "IcuSn9T77y", 
    "tJv7AbF53r", 
    "a9eZ6xYM5Y", 
]; 

$rows = $mysqli->query("SELECT * FROM songs")->fetch_all(MYSQLI_ASSOC); 

for ($i = 0; $i < count($array); $i++) { 
    $row = $rows[$i]; 
    $id = $array[$i]; 
    $mysqli->query("UPDATE songs SET id = '$id' WHERE song = '{$row["song"]}' AND artist = '{$row["artist"]}'"); 
} 

Gibt es einen besseren Weg?


UPDATE: Ich benutze Autoinkrement nicht und die ID-Spalte nicht zum Zeitpunkt der Tabelle gab es erstellt wurde. Jetzt habe ich eine ID-Spalte hinzugefügt. Es gibt mehr als 300 Einträge. IDs der Datensätze sind eindeutige zufällige Zeichenfolgen. Bevor ich einen weiteren Datensatz zur Datenbank hinzufüge, muss jeder Datensatz eine eindeutige zufällige Zeichenfolge für seine id haben, so dass ich beim Einfügen eines neuen Datensatzes eine zufällige Zeichenfolge erstellen und überprüfen kann, ob sie eindeutig ist oder nicht, indem ich sie mit den IDs vergleiche in der Tabelle.

In diesem Stadium muss ich nur die ID-Spalte mit einem Array aktualisieren. Array-Elemente sind irrelevant.

+0

Obwohl MYSQL_ASSOC tatsächlich denselben Wert wie MYSQLI_ASSOC hat, sollten Sie "MYSQLI_ASSOC" verwenden, wenn Sie mysqli verwenden. Die mysql-Funktionen sind als veraltet gekennzeichnet und werden in neueren Versionen entfernt: http://php.net/manual/en/function.mysql-fetch-array.php – Marco

+0

@Marco Fixed. Immer noch im Übergang =) – akinuri

+0

@ Down Voter, Was ist möglicherweise falsch mit dieser Frage? Wenn es irgendetwas gibt, hilf mir, es zu verbessern. Down-Voting hilft nicht wirklich. Das wird jetzt eine Sache. Gelegentliche Downvotes. Es fängt an, zu mir zu kommen. – akinuri

Antwort

1

Prepared statements sind so konzipiert, dass sie mit einem Minimum an Aufwand einmal erstellt und viele Male ausgeführt werden können. Wenn Sie diese Daten eingeben, wird auch ein absolute necessity verwendet.

Es ist lange her, dass ich etwas mit MySQLi gemacht habe (ich stark looking at PDO für viele einfachen Code empfehlen), aber dies sollte funktionieren:

$array = [ 
    "C45Rm3fLGn", 
    "ocIik81up2", 
    "IcuSn9T77y", 
    "tJv7AbF53r", 
    "a9eZ6xYM5Y", 
]; 

$rows = $mysqli->query("SELECT * FROM songs")->fetch_all(MYSQLI_ASSOC); 
$stmt = $mysqli->prepare("UPDATE songs SET id=? WHERE song=? AND artist=?"); 

foreach ($array as $i=>$id) { 
    $row = $rows[$i]; 
    $stmt->bind_param("sss", $id, $row["song"], $row["artist"]); 
    $stmt->execute(); 
} 

ich auch Ihr Array so bauen würde empfehlen, dass sie referenziert die Spalten, die Sie umbenennen. Sie verlassen sich darauf, dass sowohl die Datenbank als auch das Array in der gleichen Reihenfolge sind, was möglicherweise nicht immer der Fall ist.

+0

Ich habe vor kurzem begonnen, vorbereitete Anweisungen zu verwenden und hätte darüber nachdenken sollen. Dies scheint ein besserer Ansatz zu sein. – akinuri

+0

Ich denke, es gibt ein kleines Problem damit. Ich nehme an, Sie wollten 'foreach ($ array als $ i => $ id) eingeben {' nicht '$ rows', weil ids in' $ array' stehen. Die Länge der beiden Arrays ('$ array' und' $ row') ist gleich, daher ist es sicher, '$ array' in foreach zu verwenden. – akinuri

+0

Ja, behoben. Vielen Dank. – miken32

0

Bitte versuchen Sie diese Abfrage:

UPDATE `myTable` SET `id`= CONCAT(item-name, "-id"); 

Oder Sie können einen Zähler wie folgt festgelegt:

UPDATE `myTable`, (SELECT @i := 0) c SET `id`= CONCAT(item-name, "-id-", @i:[email protected]+1) 

Ich hoffe, dies wird Ihnen helfen.

Verwandte Themen