2016-07-11 11 views
0

次の構造のデータベーステーブルがあります。 id列が後で追加されます。したがって、idのセルはすべて空です。データベース列を(垂直方向に)配列で更新する

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

私はテーブルの値がidである配列を持っています。私はテーブル(ID列)を配列の値で更新します。例:

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

これらの項目は一意のランダムな文字列です。

どうすればよいですか?私は配列を反復し、各項目にUPDATEを使用することを考えています。

$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"]}'"); 
} 

もっと好ましい方法はありますか?


UPDATE:私は自動インクリメントを使用していないと作成されたID列がテーブルの時点で存在しなかった。さて、idカラムを追加しました。 300以上のレコードがあります。レコードのIDは固有のランダムな文字列です。データベースに別のレコードを追加する前に、すべてのレコードにidの一意のランダムな文字列が必要です。新しいレコードを挿入するときにランダムな文字列を作成し、唯一であるかどうかをidsテーブルに

この段階では、配列を使用してid列を更新するだけで済みます。配列項目は無関係です。

+0

MYSQL_ASSOCは実際にはMYSQLI_ASSOCと同じ値ですが、mysqliを使用する場合は "MYSQLI_ASSOC"を使用してください。 mysql関数は廃止予定とマークされ、新しいバージョンでは削除されます:http://php.net/manual/en/function.mysql-fetch-array.php – Marco

+0

@Marco Fixed。まだ移行中=) – akinuri

+0

@ダウン投票者、この質問に間違いがありますか?何かがあれば、それを改善するのに役立ちます。ダウン投票は本当に役に立たない。これは今のことになっています。ランダムdownvotesを得る。それは私に着き始めている。 – akinuri

答えて

1

Prepared statementsは、最小限のオーバーヘッドで一度作成して何度も実行するように設計されています。挿入するデータがユーザー生成のものである場合は、それらを使用することもabsolute necessityです。私はMySQLiを使って何をやったので、

は、それは(私は強くはるかに簡単なコードのためのlooking at PDOをお勧めします)、長い時間がかかったが、これは動作するはずです:

$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(); 
} 

は、私もそれが参照するように、あなたのアレイを構築推薦します名前を変更する列。あなたはデータベースと配列の両方が同じ順序であることに頼っていますが、常にそうであるとは限りません。

+0

私は最近準備文を使用し始めましたが、これについて考えていたはずです。これはより良いアプローチのようです。 – akinuri

+0

これには小さな問題があると思います。 idsは '$ array'の中にあるので、あなたは' foreach($ array as $ i => $ id){'not '$ rows'とタイプしたかったとします。両方の配列の長さ( '$ array'と' $ row')は等しいので、foreachでは '$ array'を使うのが安全です。 – akinuri

+0

はい、修正されました。ありがとう。 – miken32

0

このクエリを試してください:

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

それとも、このようなカウンタを設定することができます:私は、これはあなたを助けることを願っています

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

を。

関連する問題