![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
タイトルと本文だけを投稿するミニブログを作ってMySQLとPHPの練習しています。そこで記事を更新するページedit.phpを作成していますがうまくいきませんでした。下記のコード edit.php(個別記事編集ページ)について指摘・アドバイスください。よろしくお願いします。
★ファイルの構成として下記のとおりで同じ階層にあります。
index.php (タイトルと内容の一覧を表示するページ)
post.php (タイトルと内容を投稿するページ)
article.php (index.phpよりリンクされていている個別ページ)
edit.php (個別記事編集ページ article.php よりリンクされています。)
★データベース情報 dbname=blog
記事を入れるテーブル: post (カラム: no / title / content)
【わからない部分】
・分からない部分は、タイトルと内容のフォームに数値を入れると更新できるのですが、文字を入力するとエラーがでてしまいます。・それと、だんだん こんな書き方でいいのだろうかという思ってきました。
教則本や教えてgooでアドバイスを受けた方のコードを参考にして作りましたが、おそらく、私のコードの書き方が良くないと思います。下記は更新ページのedit.php ですが、更新のためには、SELECT と UPDATE を使わないといけないと思ったもので、SQLの接続を2つに分けました。
一つ目のtry{}では、index.phpより$_GETでURLからno 情報を取り出して、それを元に他の情報を取り出しています。そして2つめのtry{}では、更新情報を入力フォームより受け取り更新しています。そこで、一般的に、更新する際は、どのうよにやっているのだろうという疑問もあります。
<!-- ↓edit.php -->
<?php
try{
$dsn = 'mysql:host=localhost; dbname=blog';
$user = 'root';
$password = '*********';
$pdo = new PDO($dsn, $user,$password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql="SELECT no,title,content FROM post WHERE 1 ";
$sql.=" AND no=?";
$datas = array();
$datas[]=isset($_GET["no"])?$_GET["no"]:"";
$stmt = $pdo->prepare( $sql);
$stmt->execute($datas);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
}catch(PDOException $e){
die($e->getMessage());
}
$error = $title = $content = '';
if (@$_POST['update']) {
$title = $_POST['title'];
$content = $_POST['content'];
if (!$title) $error .= 'タイトルがありません。<br>';
if (mb_strlen($title) > 80) $error .= 'タイトルが長すぎます。<br>';
if (!$content) $error .= '本文がありません。<br>';
if (!$error && isset($_POST['update'])){
try{
$dsn = 'mysql:host=localhost; dbname=blog';
$user = 'root';
$password = '********';
$pdo = new PDO($dsn, $user,$password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = $pdo->query("UPDATE post SET title={$_POST['title']}, content={$_POST['content']} WHERE no ={$_POST['no']} ");
header('Location: index.php');
$stmt = $pdo->prepare( $sql);
$stmt->execute($datas);
}catch(PDOException $e){
die($e->getMessage());
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>記事更新 Blog</title>
<link rel="stylesheet" href="blog.css">
</head>
<body>
<form method="post" action="edit.php " onsubmit="return confirm( '更新してもよいですか' )";>
<h2>記事投稿</h2>
<p><input type="hidden" name="no" size="40" value="<?php echo $row['no'] ?>"></p>
<p>題名</p>
<p><input type="text" name="title" size="40" value="<?php echo $row['title'] ?>"></p>
<p>本文</p>
<p><textarea name="content" rows="8" cols="40"><?php echo nl2br($row['content']) ?></textarea></p>
<p><input name="update" type="submit" value="更新"></p>
<p><?php echo $error ?></p>
</form>
</body>
</html>
No.1ベストアンサー
- 回答日時:
じっくりみてませんが、ぱっと見へんなところ
>$sql = $pdo->query("UPDATE post SET title={$_POST['title']}, content={$_POST['content']} WHERE no ={$_POST['no']} ");
>header('Location: index.php');
>$stmt = $pdo->prepare( $sql);
>$stmt->execute($datas);
SQL文の作り方がまずおかしい、prepare処理なのだから直接変数を代入しない
ちなみに数字以外がエラーになるのは「SET title=たいとる」のように代入されているからで
せめて「SET title='たいとる'」のようにクウォートで文字列をくくってやらないと・・・
ただ、それをしないためにprepareで処理しているんですけど
$pdo->query()の結果を$sqlに受けちゃっているけど、このへん何をやっているか
ご自身でうまく理解していないのでは?
$pdo->query()は単純なSQL文の実行、$pdo->prepare()は外部からデータを
もってくる場合のSQL文の実行と切り分けて考えてください。
結果、こんな感じ?
$datas=array($_POST['title'], $_POST['content'],$_POST['no']);
$sql="UPDATE post SET title=?,content=? WHERE no =? ";
$stmt = $pdo->prepare( $sql);
$stmt->execute($datas);
ありがとうございます。
prepare()と query()のあたりの理解がしっかりとできていませんでした。なので、2つのやり方で実験して、比べてみることができました。そのせいでかなり勉強になりました。フォームからの入力でも query()を使用した場合は、カンマを含んだ文をフォムームに入れて入力すると、投稿できないのに対して、prepare()を使用した場合は、カンマを含んだ文でも問題なく投稿できました。それにより、SQLインジェクションの勉強にもなりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字化けについて
-
phpの画面表示が真っ白です
-
conf.php設定について
-
前後の全角スペースを削除する...
-
PHPで地域名のみ変更
-
フォントの色を変えるには?
-
透過PNGが透過されない!!
-
ImageCreate関数が undefined f...
-
onedrive にexcelファイルをア...
-
「クラス関数」「メンバ関数」...
-
FTPコマンドでディレクトリごと...
-
.phpと.incファイルの違いはな...
-
データ送信をボタンを押さずに...
-
phpのheader("Location:#pos")...
-
str ! = NULL
-
複数ファイルを連続でダウンロード
-
パースエラーとは?
-
rmdirでフォルダが消せません
-
PHP8を使うと、大量のWarningが...
-
PHPでFilename cannot be empty...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字化けについて
-
日付と年月日を選択するコード...
-
複数の文字列をファイルに書き...
-
phpの画面表示が真っ白です
-
ヒアドキュメントを中断してinc...
-
前後の全角スペースを削除する...
-
PHP(smarty)についての質問(文...
-
初心者で数当てゲームを作って...
-
どうしたら確認ができますか!?
-
すみません また宜しくお願い...
-
ローカル環境で動くのに本番環...
-
PHPのWebアプリ作成
-
PHPをはじめて1日目なので・・・
-
PHPで地域名のみ変更
-
php エラー
-
HTMLとPHP間のデータ受け渡し
-
さくらインターネットレンタル...
-
file_get_contents関数なのですが
-
XAMPP1.7.1上でPHPを実行すると...
-
mb_convert_variablesで変換出...
おすすめ情報