【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

はじめまして。
データベースの更新をして、結果を表示させる方法が分かりません。
現状、call to a member function prepare() on a non-object in ........on line 21と、エラーが表示されています。
ご教授よろしくお願いします。
<?php
require_once('index.php');
$error = '';
if (@$_POST['submit']) {
$name = (string)filter_input(INPUT_POST, 'name');
$comment = (string)filter_input(INPUT_POST, 'comment');
$price = (string)filter_input(INPUT_POST, 'price');
$code = (string)filter_input(INPUT_POST, 'code');
if (!$name) $error .= '商品名がありません。<br>';
if (!$comment) $error .= '商品説明がありません。<br>';
if (!$price) $error .= '価格がありません。<br>';
if (preg_match('/\D/', $price)) $error .= '価格が不正です。<br>';
if (!$error) {
require_once('index.php');
$sql = 'UPDATE goods SET name=:name, comment=:comment, price=:price WHERE code=:code';
$stmt = $pdo -> prepare($sql);
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':name', $comment, PDO::PARAM_STR);
$stmt->bindParam(':name', $price, PDO::PARAM_INT);
$stmt->bindValue(':value', $code, PDO::PARAM_INT);
$stmt->execute();
$stmt->closeCursor();
exit(); }
} else {

$code = $_GET['code'];
$sql ="SELECT * FROM goods` WHERE code=$code";
$smt = $dbh->prepare($sql);
//$sql->execute();
if (!$smt) {
echo "\nPDO::errorInfo():\n";
print_r($dbh->errorInfo());
}

$row = $smt->fetch() ;
$name = $row['name'];
$comment = $row['comment'];
$price = $row['price'];

}
require 't_edit.php';
?>

質問者からの補足コメント

  • 有難う御座います。
    書き直しました。更新部分です。
    <?php
    require_once('index.php');
    $sql = "UPDATE goods SET name= ?, comment= ?, price= ? WHERE code= ?";
    $stmt = $dbh -> prepare($sql);
    $stmt->bindValue(1,$name, PDO::PARAM_STR);
    $stmt->bindValue(2,$comment, PDO::PARAM_STR);
    $stmt->bindValue(3,$price, PDO::PARAM_STR);
    $stmt->bindValue(4,$code, PDO::PARAM_STR);
    $stmt->execute();
    ?>
    エラーは出ないものの、更新が反映されません。何故でしょうか。ご教授頂けると幸いです。

      補足日時:2015/03/04 00:35
  • yambejp様
    いつもありがとうございます。
    ご教授頂いた通りにやってみましたが、エラーがでず、データベースの権限もあるようです。
    他には何が考えられるのでしょうか?

    $sql,$name,$comment,$price,$codeの中身を確認すると
    object(PDOStatement)#3 (1) { ["queryString"]=> string(60) "UPDATE goods SET name= ?, comment= ?, price= ? WHERE code= ?" } string(3) "あ" string(3) "あ" string(2) "13" string(0) ""

    となっております。本来ならば「?」に値が表示されて出るのでしょうか?
    ご教授頂けると幸いです。

      補足日時:2015/03/07 09:30

A 回答 (2件)

もしされていないなら、PDOを設定する際にエラーを拾えるようにしてみてください



<?php
$dsn = 'mysql:host=localhost; dbname=xxxx';
$user = 'xxxx'; $password = 'xxxx';
$dbh = new PDO($dsn, $user,$password);
$dbh ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//そのうえで、try節でsqlを発行し、エラーをcatchします
try{
$sql = "UPDATE goods SET name= ?, comment= ?, price= ? WHERE code= ?";
$stmt = $dbh -> prepare($sql);
$stmt->bindValue(1,$name, PDO::PARAM_STR);
$stmt->bindValue(2,$comment, PDO::PARAM_STR);
$stmt->bindValue(3,$price, PDO::PARAM_STR);
$stmt->bindValue(4,$code, PDO::PARAM_STR);
$stmt->execute();
}catch(PDOException $e){
die($e->getMessage());
}
?>

文法エラーでなければ、一点$userで指定しユーザーが、該当DBの更新権限を
もっているかどうか確認しておいた方がいいと思います。
    • good
    • 0

フロー的に微妙



if (isset($_POST['submit'])) { //submitがポストされていたら
・・・・
if (!$error) { //エラーがなければ
$sql = 'UPDATE goods SET name=?, comment=?, price=? WHERE code=?';
  アップデート処理
}
} //一回とじて
if (isset($_GET['code'])){ // codeがゲットされていたら
$sql =’SELECT * FROM goods WHERE code=?';
 表示処理
}

の、流れでは?(前回も書いたような気がしますが・・・)
単なる転記ミスかもしれませんがbindParam(':name'が重複して指定してたり
SQL内のバッククォートが中途半端についていたりミスが散見されます。
凡ミスがあると本質的な質問・回答までたどり着かないので注意が必要
    • good
    • 0

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