• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PDOのプレースホルダで変数でUPDATE出来ない)

変数でUPDATEできない問題と解決方法

shimixの回答

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

>echoでは値が表示されるのでPOSTの値は受け取っていると思われます。 echoではなく、var_dumpなどで「長さ」もチェックしてください。trimせずに使っているので前後に空白が入っていても気付かない可能性があります。 普通は$_POSTを直接使わずに $serialcode = (isset($_POST['serialcode']))and(is_string($_POST['serialcode'])) ? trim($_POST['serialcode']) : ''; if ($serialcode === '') { エラー処理 } などとしてから $serialcode を使います。

ray-universe
質問者

お礼

ご回答ありがとうございます。 勉強不足でお恥ずかしいですがvar_dumpを初めて使いました。 使ってみたところご指摘の通り空白が入っており本来8桁のはずが80桁になっておりました。 POST送信元にあった空白を消す事で予定していた動作が行えました。 頂いたコードの方は是非使わせて頂き、よりよいものにしたいと思います。 本当にありがとうございました。

関連するQ&A

  • PDOについて

    プログラム初心者です 最近PDO使うようになりましたがまったく使いこなせません 何回もSQL発行して効率わるいコードになりました(--; 一回のSQL発行にまとめる方法はありますか? for ($i=0; $i<$count; $i++) { $id=$Array[$i][0]; $name=$Array[$i][1]; $stmt = $pdo -> prepare("INSERT IGNORE INTO table(id,name) VALUES (?,?)"); $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->bindValue(2, $name, PDO::PARAM_STR); $stmt->execute(); } 質問2 prepareのキャッシュを利かすってどうゆうことでしょうか?上の場合でもキャッシュ生かせていますか? よろしくお願いします

    • ベストアンサー
    • PHP
  • PDO+SQLITEでのインジェクション対策について

    こんばんは。 いつもお世話になっております。 PDO+SQLITEで現在以下のようにbindValueを用いてクエリを発行しているのですが・・・ - $sql = $connect->prepare("INSERT INTO test_tbl(name) VALUES(:name"); $sql->bindValue(":name", $_POST["name"]); $sql->execute(); - $_POST["name"]の値をbindValueに移すだけでそのままINSERTしていますが、これだけでインジェクション対策はOKなのでしょうか? 他にも注意したほうが良い事があれば教えて下さい。

    • ベストアンサー
    • PHP
  • PHP PDO execute のsql

    $sql = "select count(*) as ..........."; $PDOStatement = $pdo->prepare($sql); $PDOStatement ->bindValue(':id', $dat, PDO::PARAM_INT); $PDOStatement -> execute(); のような場合に、実際に問い合わせが行われたSQLはどうやって取得できますか?

    • ベストアンサー
    • PHP
  • PDOでMYSQL

    WHERE区の値をbindValueしているのですが、結果が取得できません。 ちなみにエラーになるわけでも文字化けを起こすわけでもありません。 $name = '太郎'; $sql = 'SELECT * FROM table WHERE name = :name; $sth = $dbh->prepare($sql); $sth->bindValue(':name', $name, PDO::PARAM_STR); $sth->execute(); $result = $sth->fetchAll(); print_r($result); いろいろ試してたところ、日本語だと結果を取得しないようで SQLデータの「太郎」となっていた箇所を「tarou」に変更し 変数の部分だけ変更したところ結果を取得できました。 $name = 'tarou; 基本の構文は合っていると思うのですが単純に日本語の指定が できないのでしょうか? PHPとMYSQLは全てUTF-8でバージョンは下記の通りです。 PHP:5.3.8 MYSQL:Client API version mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $ PDO: PDO drivers mysql, odbc, sqlite, sqlite2 Client API version mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $

    • ベストアンサー
    • PHP
  • 配列をループさせてUPDATE

    投票システムでチェックボックスから選択されたキーをまとめてUPDATEするには、 どの様なUPDATE文にすれば良いのでしょうか? -------------------------------------------------------------- for ($i = 0; $i < count(@$_POST["answer"]); $i++) { echo $_POST["answer"][$i]."が選択されました"; // ← 一応PHP上で正常に値が返るかを確認しました。 $data = $_POST["answer"][$i]; // ←変数に置き換えました。 $conn = db_conn(); $sql = "UPDATE an SET "; $sql .= " sel" . $data . "cnt = sel" . $data . "cnt + 1"; $sql .= " WHERE id = '" . cnv_sqlstr($id) . "'" ; } -------------------------------------------------------------- という様に書くと、最後にチェックしたキーのみがUPDATEされ、 その他のキーは無視されてしまいます。 echo文でPHP上で正常に走っているかどうかを確認したところ 問題はありませんでしたが、UPDATE文でデータベースに投げると 上手くいきません。 どうかご教示の程よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • PDOの複数クエリ

    PHP5.29 Apache2 MySQL5 PDOを使用して複数クエリを実行しようとしています。 update文、delete文が失敗してしまいます。 ------------------------------------------------- データベース接続省略 $id=$_POST['id'];要素が数値の配列 $time=$_POST['myFormDate'];//0000-00-00型の日付 $count=$_POST['count'];//数値の配列 上記3つの変数はprintし、変数は代入されている。 for($i=0;$i<count($id);$i++) { $update='update test set count=? used_day=? where id=?'; $stmt=$db->prepare($update); $flag=$stmt->execute(array($count[$i],$time,$id[$i])); if ($flag){ print('データ更新に成功しました<br>'); }else{ print('データ更新に失敗しました<br>'); } } --------------------------------------------------------- 何故これでupdate出来ないのか、またはdelete文にしても削除されないのか全くわかりません。select文にすると正確に表示されます。 どなたかおわかりになる方いらっしゃいましたらご教授お願い致します。

    • 締切済み
    • PHP
  • pdo

    個別で指定がない限り全体のsetFetchModeを最初に定義したいのですがエラーになってしまいます。 マニュアル等も見たのですがいまいち理解できず質問させて頂きました。 全体の指定をするにはどのように書けばいいでしょうか?以下現在のソースです。 また、pdoは初めて使用するのですがその他に定義しておいたほうがいい定数等がありましたら 是非アドバイスをお願い致します。 (自分で思いつくのは文字コードとフェッチモード程度でした^^;) $sql = "SELECT * FROM table where id = ?"; try { $pdo = new PDO($dsn, $user, $password); if ($pdo == null){ print('接続失敗'); } //$pdo->setFetchMode(PDO::FETCH_ASSOC); $pdo->query('SET NAMES utf8'); $stmt = $pdo->prepare($sql); if ($stmt->execute(array(1))) { while ($row = $stmt->fetch()) { print_r($row); } } } catch (PDOException $e) { print('Error:'.$e->getMessage()); die(); } $pdo = null;

    • 締切済み
    • PHP
  • PDOについての質問です。宜しくお願い致します。

    PDOについての質問です。宜しくお願い致します。 久しぶりに質問させていただきますどうかよろしくお願い致します。 技術評論会社から出版されているPHP+MySQL Webシステム構築という書籍を参考に プログラムを組んでいるのですがコードを見るとかなり古くMySQLに接続するコードに mysql_connectなど非推奨のものが使われています。 そのコードを自分なりにPDOに直しているのですが、errorはなんとか無くなり表示も問題なく されるのですがはたして本当に間違いのないプログラムなのか私には判断がつきませんので どうかご教授いただきたいと思っております。 何卒よろしくお願い致します。 プログラムは以下のようになります。 <?php header("Content-Type: text/html; charset=utf-8"); ?> <?php require_once("photolibini.php"); try { $dsn = 'mysql:dbname=photolibdb;host=localhost'; $user = '******'; $password = '*****'; $dbh = new PDO($dsn, $user, $password); $dbh->query('SET NAMES utf8'); //カテゴリを集計するSQLを組み立てます $sql = "SELECT tblphoto.categoryid, categoryname, Count(photoid) AS cnt FROM tblphoto INNER JOIN tblcategory ON tblphoto.categoryid = tblcategory.categoryid GROUP BY tblphoto.categoryid ORDER BY tblphoto.categoryid"; $stmt = $dbh->prepare($sql); $stmt->execute(); $dbh = null; //ページ本文を組み立てます $body = "現在、次のカテゴリの写真が登録されています。表示したいカテゴリをクリックしてください。 <BR><BR> <UL type='circle'>"; //結果セットからデータをループで読み込みます while ($col = $stmt->fetch(PDO::FETCH_ASSOC)) { $body .= "<LI><A href='search.php?categid=$col[categoryid]'> $col[categoryname]</A> " . "($col[cnt]件)"; } } catch(Exception $e) { print'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } ?> <?php $body .= "</UL>"; //ページヘッダを出力します echo htmlheader("カテゴリ別一覧"); //ページ本文を出力します echo $body; //ページフッタを出力します echo htmlfooter(); ?>

    • ベストアンサー
    • MySQL
  • PDOクラスのprepareメソッドについて。

    いつもお世話になっております。 PHP5.2.5 1|$conn = new PDO($dsn,~略~);   //データベース接続 2|$sql = "略";             //SQL文 3|$stmt = $conn->prepare($sql);   // PDOStatementオブジェクトを返す 4|$stmt->bindParam(~略~);     //プレースホルダに変数をバインド 5|$stmt->execute();         //クエリ実行 という、よくある流れにおいて、 4行目のbindParamメソッドは、PDOクラスのメソッドではなく、 PDOStatementクラスのメソッドだと思うのですが、 これを、$stmt-> で呼び出せているのが、どうしてなのかがよく分からずにいます。 3行目で、PDOクラスのprepareメソッドを使うことで、 PDOStatementオブジェクトが返されるため、 その返り値を受け取った「$stmt」によって、 「$stmt->bindParam」できているという感じでしょうか? ★まず、この私の考え方について、合っているか間違っているか、 お聞きしたいと思います。(質問1) //=================================================== 恐らく、上記の考え方は「合っている」のだと思うのですが、 その上で、さらに質問をさせて頂くと、 ではなぜ、PDOStatementクラスを使う時に、 new PDOStatement; というようにしないのでしょうね? PDOクラスの1メソッドであるprepareメソッドを使うようにして、 PDOStatementクラスをインスタンス化しているのはなぜなのでしょう? (prepareメソッドはどういうコードになっているのでしょう?その中で、new PDOStatement という記述があるのでしょうね?) PDOのこのような仕様の背景には、どういう意図があるのか、 どなたか何か思い当たることなどありましたらご助言下さい。 (質問2)

    • ベストアンサー
    • PHP
  • php pdo データベース

    前に書き込んだのが状況がわかったので再度書きます update.phpでGETで取った番号のデータを表示します 番号は主キーなので変更できないように表示のみにします update.phpのフォームをuptate2.phpに送ります <?php $ID = htmlspecialchars($_GET['番号']); $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("SELECT * FROM tbl_test WHERE 番号=?"); $st->execute(array($ID)); $row = $st->fetch(); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update2.php" method="post"> 番号<br> <?php echo $ID ?><br> <input type="hidden" name="ID" value="<?php echo $ID; ?>"> 氏名<br> <input type="text" SIZE = "50" NAME="NAME" value="<?php echo $NAME ?>"><br> 住所<br> <input type="text" SIZE = "130"NAME="ADDR" value="<?php echo $ADDR ?>"><br> <input type="submit"> </form> アップデ-トphp update2.php <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("UPDATE tbl_test SET 氏名=?,住所=?WHERE 番号=?"); $st->execute(array($_POST['ID'],$_POST['NAME'], $_POST['ADDR'])); ?> レコードを修正しました。 今の現状 エラーが出ないでレコードを修正しました。と表示されるがレコードが修正されていない どこがいけないと思いますか?

    • ベストアンサー
    • PHP