

PHP初心者です。

detail.phpで各idに紐付いているデータベースを表示し、dataupdate.phpでそれらの値を更新する。

という作業をやりたいのですが、うまくいきません。

detail.phpは下記（一応、うまく動きました）

[code]

    <?php 
    //DBへ接続
    $pdo = new PDO('mysql:dbname=otoiawase;host=localhost','root','');
    //文字コードを指定
    $stmt = $pdo->query('SET NAMES utf8');
    //データ登録SQL作成
    $stmt = $pdo->prepare("SELECT * FROM address_table WHERE id=:id");
    $stmt->bindParam(':id', $_GET['id']);
    //SQL実行
    $flag = $stmt->execute();
    
    //エラー処理
    if($flag == false){
     echo "SQLエラー";
    }else{
     
     $result = $stmt->fetch();
     
      $name = array_column($result,'name');
     // //$resultからemailの配列を取り出す
      $email = array_column($result,'email');
     
    }
    
    ?>
    
    <!DOCTYPE html>
    <html lang="ja">
    <head>
     <meta charset="UTF-8">
     <title>Document</title>
     
     </style>
    </head>
    <body>
     <form action="dataupdate.php" method="post">
     <input type="text" name="id" value="<?php echo $result['id']; ?>">
     <input type="text" name="name" value="<?php echo $result['name']; ?>">
     <input type="text" name="email" value="<?php echo $result['email']; ?>">
     <input type="submit" value="更新する">
     </form>
     
    </body>
    </html>
[/code]

ここからdataupdate.phpで更新をしたいのですが、うまくいきません。。。

dataupdate.phpは下記になります。何が原因なのか調べてみてもよくわからなかったのでご指摘いただけると幸いです。

[code]

    <?php 
    $id = $_POST['id'];
    $name = $_POST['name'];
    $email = $_POST['email'];
    
    
    //DBへ接続
    $pdo = new PDO('mysql:dbname=otoiawase;host=localhost','root','');
    //文字コードを指定
    $stmt = $pdo->query('SET NAMES utf8');
    //データ登録SQL作成
    $update = $pdo->prepare("UPDATE address_table SET name=:name,email=:email WHERE id=:id");
    $update->bindValue(':name','$name');
    $update->bindValue(':email','$email');
    $update->bindValue(':id','$id');
    
    //SQL実行
    
    $flag = $update->execute();
    
    
    ?>
    
    <!DOCTYPE html>
    <html lang="ja">
    <head>
     <meta charset="UTF-8">
     <title>Document</title>
    </head>
    <body>
     データ更新しました。
    </body>
    </html>
[/code]


CC BY-SA 3.0
2016-04-08T10:41:31.600
23848
2016-04-08T14:22:27.687
9542
question
php mysql phpmyadmin
PHPからデータベースの更新をするところでつまづいています。


コメントに書いたように、どう「うまくいきません」かさっぱりわからないので、他にもあるかもしれませんが、少なくともこの3行は修正が必要です。

[code]

    $update->bindValue(':name','$name');
    $update->bindValue(':email','$email');
    $update->bindValue(':id','$id');
    
[/code]

PHPは単独引用符`''`で囲まれた文字列は内部に`$`なんかの文字が存在しても、変数展開の対象にはなりません。従ってあなたのコードは`id`列の値が`$`
`i` `d`の3文字であるレコードの`name`列の値を`$` `n` `a` `m` `e`の5文字に、`email`列の値を`$` `e` `m`
`a` `i`
`l`の6文字に置き換える、というコードになっています。普通は`id`列の値が`$id`であるレコードなんて存在しないでしょうから、これを実行しても「何も起こっていないように見える」はずです。

引用符で囲む必要はないので、記述するとしたら、こうでしょう。

[code]

    $update->bindValue(':name', $name);
    $update->bindValue(':email', $email);
    $update->bindValue(':id', $id);
    
[/code]

この修正をしてもまだ何かあってうまくいかない場合は、(コメントに書いたような点を注意して)ご質問に追記するか、この回答へのコメントとしておしらせください。

* * *

なお、今回の問題には直接は関係ないでしょうが、PHP変数の値をHTML内に出力する場合には、適切にエスケープすることを忘れないでください。

[code]

    <input type="text" name="id" value="<?= htmlspecialchars($result['id']) ?>">
    <input type="text" name="name" value="<?= htmlspecialchars($result['name']) ?>">
    <input type="text" name="email" value="<?= htmlspecialchars($result['email']) ?>">
    
[/code]

入門中の練習コードであるのは丸わかりなのですが、これについては最初のうちから慣れておいて「エスケープしないまま変数の値をHTML中に出力すると気持ち悪い」と思うくらいになってもらわないと困ります。(よりきちんとしたエラーチェックや、入力値のサニタイジング・バリデーションなんかはもう少し学習が進んでからでも良いでしょうが。残念ながら、PHP入門記事では全く触れられていないものが多いですね。)


CC BY-SA 3.0
2016-04-08T13:09:53.243
23850
2016-04-08T13:09:53.243
13972
23848
answer


ご指摘ありがとうございます！聞き方が悪かったようで、大変失礼致しました！

うまくいかないというのは、「ブラウザ上でシンタックスエラーなどのエラーは出ないが、データが更新されない」というものでした。

ご指摘いただきましたように  
$update->bindValue(':name', $name);  
$update->bindValue(':email', $email);  
$update->bindValue(':id', $id);

の変数部分（$name,$email,$id）を''で囲んでしまい、そのミスを見つけられずにおりました。。。  
PHPを勉強して2日目だったので、このような初歩的な質問をしてしまいまして、申し訳ございませんでした！

修正しましたらコードがちゃんと動くようになりました。ありがとうございました！


CC BY-SA 3.0
2016-04-08T14:22:27.687
23855
2016-04-08T14:22:27.687
9542
23848
answer