電子書籍の厳選無料作品が豊富!

お世話になります。

jQueryの「 sortable 」というプラグインを使用して、データベースから
「id」、「name」、「price」、「no」というデータをselectして、ブラウザで並び順を変更後に
updateするという流れですが、最終的にシリアライズした配列をDBへupdateできません。

「id」は連番にしてユニークな値が入っていて、「no」には並び順の値が半角数字で入れてあります。

シリアライズした配列のデータは、ブラウザで確認すると問題ありません。
恐らくupdateの際のforeachの処理が上手く行ってないように感じますが、
正常に「id」と「no」の整合性を取ってDBに投げるには、どの様に組み立てたら良いのでしょうか?

以下が主要箇所のソースです。

-------------------------------------------------------

<script src="js/jquery-1.9.1.js"></script>
<script src="js/jquery-ui-1.10.3.custom.js"></script>
<script>
$(function() {
$(".sortable").sortable();
$(".sortable").disableSelection();
$("#submit").click(function() {
var result = $(".sortable").sortable("toArray");
$("#result").val(result);
$("form").submit();
});
});
</script>

<form action="index.php" method="post">
<ul class="sortable">

<?php
// DB接続
include "db_pdo_conn.php";

$sql1 = "SELECT id, name, price, no FROM sortable ORDER BY no";
$stmt = $conn->prepare($sql1);
$stmt->execute();

foreach ($stmt as $row) {

$id = $row["id"];
$name = $row["name"];
$price = $row["price"];
$no = $row["no"];

echo <<<li
<li class="ns" id="$id">{$name} {$price} {$no}</li>
li;
}


$result = $_POST['result'];

$result_array = explode(',', $result);


//シリアライズした$result_arrayを表示
print_r(serialize($result_array));

//データが送信されたときに変更する
if (count($_POST)) {

//nomを「 1 」から振り替える
$nom = 1;

foreach ($result_array as $id){

$nom++;

$sql2 = "UPDATE sortable SET no='$nom' WHERE id='$id'";
$stmt = $conn->prepare($sql2);
$stmt->execute(array($no_comp, $id_comp));

}

}
?>

</ul>
<input type="hidden" id="result" name="result" />
<button id="submit">submit</button>
</form>

-------------------------------------------------------

3日程試行錯誤しておりますが、解決できる糸口が見つからないので
ご存知の方がいらっしゃいましたら、ご教示の程どうぞよろしくお願い申し上げます。

----------------
▼スペック

PHP 5.3.3
MySQL 5.0.95
----------------

A 回答 (3件)

PHP部分だけざっと書き直してみました。

UPDATEをSELECTより先にしなければならないことは自明ですね。

<?php

include 'db_pdo_conn.php';

if (isset($_POST['result'])) {
__$sql = 'UPDATE sortable SET no = ? WHERE id = ?';
__$stmt = $pdo->prepare($sql);
__foreach (explode(',', $_POST['result']) as $i => $id) {
____$stmt->execute(array(++$i, $id));
__}
}

$sql = 'SELECT id, name, price, no FROM sortable ORDER BY no';
foreach ($conn->query($sql) as $row) {
__vprintf('<li class="ns" id="%s">%s %s %s</li>' . PHP_EOL, $row);
}

?>
    • good
    • 0
この回答へのお礼

いつも貴重なアドバイスをいただき本当にありがとうございます。

おかげさまで無事解決できました。

explode(',', $_POST['result']) as $i => $id

がミソになりますね。
ご回答をいただけてなければ、この書き方は全く思いつかなかったと思います。

お礼日時:2013/12/16 17:34

訂正


$pdo->prepare($sql);

$conn->prepare($sql);
    • good
    • 0
この回答へのお礼

いつも貴重なアドバイスをいただき本当にありがとうございます。

おかげさまで無事解決できました。

お礼日時:2013/12/16 17:30

$_GET, $_POSTなどを受け取る際の処理


http://qiita.com/mpyw/items/2f9955db1c02eeef43ea

PHPでデータベースに接続するときのまとめ
http://qiita.com/mpyw/items/b00b72c5c95aac573b71

使いやすいPDOの継承クラス
http://qiita.com/mpyw/items/f4369c87b689cb6ac35e


とりあえず、PDOで例外をスローさせる設定にしてください。原因が分かるはずです。
    • good
    • 0
この回答へのお礼

いつも貴重なアドバイスをいただき本当にありがとうございます。

おかげさまで無事解決できました。

お礼日時:2013/12/16 17:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!