![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
ツッコミどころ満載ですが、それについてはすでに指摘がありますね
根本的な問題として、
>$sql = 'UPDATE mst_productSET name=?,price=? WHERE code=?';
$sql = 'UPDATE mst_product SET name=?,price=? WHERE code=?';
でないとマズイのでは?
No.3
- 回答日時:
訂正
PDO::ATTR_USE_BUFFERED_QUERY => true
↓
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
No.2
- 回答日時:
下の記事をよくお読みください。
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;
これは(好みですが)書かなくてもいいです。後ろに続く処理が文字列を少量出力するだけなので、ここでデータベースと切断しても、最後にデータベースと切断しても全く差がありません。
貴重なお時間をありがとうございます。
ご教授頂いたURL先、アドバイス頂いた内容を読み返しましたが、いまいち当方では理解できない内容でした。
折角ご回答頂いたのに申し訳ありません。
ただ、なんとなく現状のプログラムでは、問題があることはわかりました(^^;
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP php ログイン 1 2022/11/01 00:24
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLインジェンクション対策法を...
-
このプログラムの改善点を教え...
-
PHP+MySQLの「データ...
-
functionとclassの使い分け
-
phpで読み込んだcsvが文字化け...
-
パラメータを2個つけたい
-
連想配列について
-
phpで変数を使ってcopyできない
-
C# 同じ処理をまとめたい
-
Fortranでのファイル名操作につ...
-
PHPで作成した2つのプログラム...
-
JSONデータ登録について
-
PHPの改変について
-
phpでランダムにページを表示
-
初心者です。入力フォームのp...
-
引数と変数について
-
HTMLで前の画面に戻る時、入力...
-
<input type="hidden" >で配列...
-
PHPでURLにジャンプするには?
-
コンボボックス(プルダウン)...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA で、スペースを含むファイ...
-
ファイル名を変更してアップロ...
-
アップロードファイル名の文字化け
-
PHPからHTMLへの変数の受け...
-
プログラミングC++のmapについて
-
phpで変数を使ってcopyできない
-
Flaskでサーバー立ち上げに関して
-
POSTの項目に追加
-
SQLインジェンクション対策法を...
-
パラメータを2個つけたい
-
サブフォルダ内の全てのテキス...
-
フォームで送られてきたメール...
-
PHP FTPサーバへの画像アップロ...
-
連想配列を複数条件で比較して...
-
name属性が全角の場合・・・
-
if function PHP
-
マクロ(VBA)について
-
PDOのprepareでLIKEの部分一致...
-
画像をDBに登録できない
-
php メールフォーム エラー表...
おすすめ情報