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

PHP初心者です。

先日より、PHPプログラムを勉強しており、「参照」、「追加」、「修正」、「削除」の一連の流れを理解しました。
スタッフ登録をするという仮定で、上記流れをPHPでできるようになり、データベースの更新もできるようになりました。
登録 → 表示 や、一覧を表示して、ラジオボタンで選んだスタッフの情報修正などです。

現在、上記流れの延長として、商品の登録から、修正、削除に挑戦していますが、情報修正時、ページはスタッフ登録と同じように最後までエラー無く進みますが、データベースが更新されません。

何故初心者の為、解決策の探し方すら判らない為困っています。
どなたかお解りになる方、恐れ入りますがご教授頂ければ幸いです。

データを修正するソースです


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>どっとこむ</title>
</head>
<body>

<?php

try
{
$pro_code = $_POST['code'];
$pro_name = $_POST['name'];
$pro_price = $_POST['price'];

$pro_code = htmlspecialchars($pro_code);
$pro_name = htmlspecialchars($pro_name);
$pro_pass = htmlspecialchars($pro_price);

$dsn = 'mysql:dbname=xxxx;host=xxxxx';
$user = 'userid';
$password = 'password';
$dbh = new PDO($dsn,$user, $password);
$dbh->query('SET NAMES utf8');

$sql = 'UPDATE mst_productSET name=?,price=? WHERE code=?';
$stmt = $dbh->prepare($sql);
$data[]=$pro_name;
$data[]=$pro_price;
$data[] = $pro_code;
$stmt->execute($data);

$dbh = null;
print 'を追加しました。<br />';
}
catch (Exception $e)
{
print'ただいま障害により大変ご迷惑をお掛けしております。';
exit();
}

?>
<a href="pro_list.php">戻る</a>
</body>
</html>

上記表示される前のページ(修正する情報を入力するページ)から、上記ページまではデータが渡っている状態です。
<?php print $pro_name; ?>
のようにすると、渡された文字列が表示されます。

わかり難い説明で恐縮です。
宜しくお願い致します。

A 回答 (4件)

ツッコミどころ満載ですが、それについてはすでに指摘がありますね




根本的な問題として、

>$sql = 'UPDATE mst_productSET name=?,price=? WHERE code=?';

$sql = 'UPDATE mst_product SET name=?,price=? WHERE code=?';

でないとマズイのでは?
    • good
    • 0

訂正



PDO::ATTR_USE_BUFFERED_QUERY => true

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
    • good
    • 0

下の記事をよくお読みください。



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


念のためダメ出しを書いておきます。

> $pro_code = $_POST['code'];
> $pro_name = $_POST['name'];
> $pro_price = $_POST['price'];

スクリプトに直接アクセスされた場合に備え、issetによるチェックを最低限行ってください。未定義であった場合はRuntimeExceptionなどの例外をスローさせましょう。issetに加えてis_stringで文字列であるか(!is_arrayで配列でないか)チェックする処理もはさむとベターです。

> $pro_code = htmlspecialchars($pro_code);
> $pro_name = htmlspecialchars($pro_name);
> $pro_pass = htmlspecialchars($pro_price);

データベースに挿入する文字列に対してHTML特殊文字をエスケープする処理は行わないでください。データベース用のエスケープ処理はPDOのプリペアドステートメントが担う役割なので、あなたは何も考える必要はありません。HTML特殊文字をエスケープする処理は実際にechoする直前に行ってください。

> $dsn = 'mysql:dbname=xxxx;host=xxxxx';

charset指定も行ってください。

> $dbh = new PDO($dsn,$user, $password);

第4引数の連想配列オプションで最低限

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

は渡してください。今回のようにUPDATEに失敗したときなどにも例外がスローされるようになります。加えて、MySQLの自動的な型変換、例えばDATEカラムに「あいうえお」という文字列が「0000-00-00」に変換されて無理矢理挿入されるのを避け、例外を発生させて処理を中断したい場合は

PDO::MYSQL_ATTR_INIT_COMMAND => "SET SESSION sql_mode='TRADITIONAL'"

も入れてください。今回は関係ありませんが、追加で

PDO::ATTR_USE_BUFFERED_QUERY => true
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC

を入れておくとSELECTを扱う際に使い勝手がよくなります。

> $dbh->query('SET NAMES utf8');

$dsnで指定し、SET NAMESは使わないでください。

> $data[] = $pro_name;
> $data[] = $pro_price;
> $data[] = $pro_code;
> $stmt->execute($data);

$pro_priceと$pro_codeは文字列じゃなくて整数のカラムですよね?もしそうであればこのままだとMySQL側で発生する文字列型から整数型への変換でパフォーマンスが低下してしまうので、

$stmt->bindValue(1, $pro_name, PDO::PARAM_STR);
$stmt->bindValue(2, $pro_price, PDO::PARAM_INT);
$stmt->bindValue(3, $pro_code, PDO::PARAM_INT);
$stmt->excecute();

の方がベターです。executeを使っても全く問題ないのは、渡すパラメータが全て「文字列」カラムに対応するときだけです。

> $dbh = null;

これは(好みですが)書かなくてもいいです。後ろに続く処理が文字列を少量出力するだけなので、ここでデータベースと切断しても、最後にデータベースと切断しても全く差がありません。
    • good
    • 0
この回答へのお礼

貴重なお時間をありがとうございます。

ご教授頂いたURL先、アドバイス頂いた内容を読み返しましたが、いまいち当方では理解できない内容でした。
折角ご回答頂いたのに申し訳ありません。

ただ、なんとなく現状のプログラムでは、問題があることはわかりました(^^;

ありがとうございます。

お礼日時:2013/11/21 10:30

php,mysqlは使ったことが無いので間違っているかもしれないけど、comiitはいらないのかな?

    • good
    • 0

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