MYSQLのUPDATEの順番について - PHPプロ!Q&A掲示板

2647

  • 0P

MYSQLのUPDATEの順番について

質問日時 / 2010年3月30日 23:52    回答数 / 5件

Questioner:  annko  このエントリーをはてなブックマークに追加 

キーワード / UPDATE    prepare    MYSQL   

質問させていただきます。

下記のコードでデータの更新を行いたいのですが
$item['BLANK']の値が0で
$item['RANK']の値が1だと
$bannerでの$item['BLANK']と$item['RANK']の順番が逆になり
$item['BLANK']に1、item['RANK']に0が入ってしまいます。
どうしたら良いのでしょうか?
よろしくお願いいたします。

  1. $query = "UPDATE tpl_banner SET NAME = ?, URL = ?, URL_M = ?, BLANK = ?, RANK = ?, UPDATE_DATE = now() WHERE ID = ? ";
  2.   $banner = array();
  3.   foreach($_POST['BANNER'] as $key => $item){
  4.   $item['BLANK'] = (ISSET($item['BLANK']) ? 1 : 0);
  5.   $item['RANK'] = (ISSET($item['RANK']) ? 1 : 0);
  6.     $item['ID'] = $key;
  7.     array_push($banner, $item);
  8.   }
  9.  
  10.   $pre = $hDB->prepare($query);
  11.   $result = $hDB->executeMultiple($pre, $banner);

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01kaitauそれ、「$item['BLANK']の値が0」の時って、 3行目
 ┗A01-1annkokaitau様 回答ありがとうございます。 $item['BLA
  ┗A01-1-1kaitauその、 > Array ( [NAME] => あいうえお ... となっ
   ┗A01-1-1-1annkokaitau様 ありがとうございます。 確認したのは質
    ┗A01-1-1-1-1kaitau 最初のコメントでも少し触れましたが、 3行目 for

回答一覧

並び替え:

A01
answererkaitau [4月1日 09:58] (最終編集:4月1日 10:01)

それ、「$item['BLANK']の値が0」の時って、
3行目のforeachで取り出した時点では実は
$item配列に BLANK キーが無かったりしませんか。

だとするとBLANKキーを4行目で追加してることになり、
配列の最後になってしまうのですが。

使用しているライブラリがわかりませんが、多くの場合、
?を使うプリペアドステートメントは、配列から順番に値を
取り出してbindする事が多いので、それで当てられる値が
おかしくなっているかもしれません。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerannko [4月1日 17:38]

kaitau様
回答ありがとうございます。

$item['BLANK']と$item['RANK']はチェックボックスで値を渡しております。

$item['BLANK']にチェックを入れずに更新すると
Array ( [NAME] => あいうえお [URL] => http://yahoo.co.jp [URL_M] => http://yahoo.co.jp [RANK] => 1 [BLANK] => 0 [ID] => 1 ) 
となってしまいます。

その他の場合は
Array ( [NAME] => あいうえお [URL] => http://yahoo.co.jp [URL_M] => http://yahoo.co.jp [BLANK] => 1 [RANK] => 0 [ID] => 1 ) 
になり、思うような順番になります。

何かお分かりになりましたら、よろしくお願いいたします。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyerkaitau [4月1日 18:05]

その、
> Array ( [NAME] => あいうえお ...
となってる$itemの値を確認したのはどこですか?
質問文のコードだと何行目の後(前)になりますか。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerannko [4月1日 21:43]

kaitau様
ありがとうございます。

確認したのは質問文のコードの7行目に次の行にprint_rで出力しました。

よろしくお願いいたします。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyerkaitau [4月2日 12:18]


最初のコメントでも少し触れましたが、
3行目 foreach で取り出した時点で$item に BLANKキーが無い場合、
4行目を実行すると、$item配列の末尾に追記されます。
一方、 ? のプレースホルダーを持ったプリペアー度ステートメントに値を
割り当てる場合、値は配列の順番に割り当てられます。
おそらくこれは(繰り返しますが使用しているライブラリがわかりませんが、)
仕様なので、プレースホルダーの順番に値を割り当てられるように別途配列を
作る必要があるということです。

だから、たとえば
$row = array($item['NAME'],$item['URL'],...,$item['RANK'],$key);
みたいな変数を別途設けて、これを$bannerに追加する方向で
作ってみてはいかがでしょうか。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)