• 締切済み

PDOでDB

PDOでDBを表示させ修正ボタンを押し別ウインドウが開き選んだデータの修正を行いたいのですがupdate2.phpでエラ-メッセージが出ます。どうやったら直りますか 下記のメッセージです Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\WWW\test\htdoes\update2.php on line 4 レコードを修正しました。 ちなみに 番号 int プライマリ-キ- 氏名 varchar 住所 varcharです 下記はソースです 一覧画面 <HTML> <HEAD> <TITLE>一覧画面</TITLE> </HEAD> <BODY> <table border="1"> <tr> <th>番号</th> <th>氏名</th> <th>住所</th> <th>操作</th> </tr> <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->query("SELECT * FROM tbl_test"); while ($row = $st->fetch()) { $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr><td>$ID</td><td>$NAME</td><td>$ADDR</td><td><a href='update.php?番号=$ID'>修正</a></td></tr>"; } ?> </table> </BODY> </HTML> アップデートの入力フォーム update.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(); $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update2.php" method="post"> 番号<br> <?php echo $ID ?><br> 氏名<br> <input type="text" NAME="NAME" value="<?php echo $NAME ?>"><br> 住所<br> <input type="text" NAME="ADDR" value="<?php echo $ADDR ?>"><br> <input type="submit"> </form> アップデートの処理 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['NAME'], $_POST['ADDR'])); ?> レコードを修正しました。 アップデートの処理 update2.phpで 最初のエラーが出ます

noname#197690
noname#197690
  • MySQL
  • 回答数4
  • ありがとう数4

みんなの回答

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.4

PHPは知らないので。。。ごめんなさい。 update.phpの記述にならって $st->execute(array($_POST['NAME'], $_POST['ADDR'], $ID)); ではどうですか?

noname#197690
質問者

お礼

ありがとうございます まだエラーがでます Notice: Undefined variable: ID in C:\WWW\test\htdoes\update2.php on line 4 レコードを修正しました。

noname#197690
質問者

補足

悔しいですね どうやればできるのでしょうか?

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.3

>どう記述すればいいですか? $st->execute(array($_POST['NAME'], $_POST['ADDR'], $_POST['ID'])); でいいかな。

noname#197690
質問者

お礼

ありがとうございます エラーが変わりました Notice: Undefined index: ID in C:\WWW\test\htdoes\update2.php on line 4 レコードを修正しました。 <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("UPDATE tbl_test SET 氏名=?,住所=?WHERE 番号=?"); $st->execute(array($_POST['NAME'], $_POST['ADDR'], $_POST['ID'])); ?> レコードを修正しました。

noname#197690
質問者

補足

updata.phpの記述が間違っているのでしょうか

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.2

>上を二つに >$st = $pdo->prepare("UPDATE tbl_test SET 氏名=?,住所=?WHERE 番号=?"); コンピュータの気持ちになって考えてみてください。 氏名と住所を変更するのは分かった。で、何番のデータを変更するの? ?は”3つ”ありますよね。

noname#197690
質問者

お礼

ごめんなさい。 言いたいことはわかります どう記述すればいいですか?

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

$st = $pdo->prepare("UPDATE tbl_test SET 番号=?,氏名=?,住所=?WHERE 番号=?"); $st->execute(array($_POST['NAME'], $_POST['ADDR'])); ?> 上の文は番号と氏名、住所、番号をパラメータ化していますよね。 下の文は番号と氏名、住所、番号を渡してやらなくてはいけないのに、氏名と住所だけしか 渡していないのでは?

noname#197690
質問者

お礼

ありがとうございます! 番号は主キーなので変更できないように表示のにしました 指摘ありがとうございます <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("UPDATE tbl_test SET 氏名=?,住所=?WHERE 番号=?"); $st->execute(array($_POST['NAME'], $_POST['ADDR'])); ?> レコードを修正しました。 上を二つにしたいのにまだ同じエラーが出ます なぜですかね

関連するQ&A

  • 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
  • php データベース更新

    番号 int プライマリーキー 氏名  varchar 住所 varchar 一覧画面に修正というボタンをつくりボタンクリックすると入っているデータがテキストボックスで表示され入力できるようにした。 番号は主キーなので表示のみにして編集できないようにした ソース GETで番号をとりupdate2.phpにわたす update.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(); $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update2.php" method="post"> 番号<br> <?php echo $ID ?><br> 氏名<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'])); ?> レコードを修正しました。 だかupdate2.phpでエラ-がおきて先に進めません

    • ベストアンサー
    • PHP
  • PDOでDB ページング

    一覧画面と検索画面を一緒にしています 一覧画面は10件表示にし、テキストになにも入力されてなかったらデータを全件表示したいです また、1 l 2 l 3 のようにページを表示し、また何件中何件目データですと表示したいです <!--一覧画面 index.php--> <html> <head> <title>一覧画面</title> </head> <body> <br><br> <blockquote> 一覧画面 <br><br> <?php if ($_GET) { // データがGETされていたら $event = isset($_GET['event']) ? $_GET['event'] : ''; // 取得 if (isset ($_GET['page'])==false) { $page=0; } else { //そうでなければpageパラメータの値をpage変数にセット $page = $_GET['page']; } } ?> <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $name=isset($_GET['name'])?$_GET['name']:""; $sql ="select * from tbl_test where "; $sql.="`氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.= " limit " . $page*10 . ", 10" ; $stmt = $pdo->prepare( $sql); $stmt->execute(array($name,$name)); $count = $stmt->rowCount(); if($count>0){ print "<table border=1>" ; print "<tr>"; print "<th>番号</th>"; print "<th>氏名</th>"; print "<th>住所</th>"; print "<th>操作</th>"; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ print "</tr>"; $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td></tr>"; }; print "</table>" ; }else{ print "該当するデータがありません"; } ?> <br><br><br> <form action = "index.php" method="GET"> <input type="hidden" name="event" value="find"> <input type="text" name="name"style ="font-size:20px;width: 400px; height: 40px"> <input type="submit" value="検索" style ="font-size:20px;width: 100px; height: 40px"> </form> <br><br> <form action = "regist.php" method="GET"> <input type="hidden" name="event" value="regist"> <input type = "submit" value = "新規登録" style ="font-size:20px;width: 100px; height: 40px"> </form> <input type="hidden" name="page" value="0"> </blockquote> </body> </html> 検索のテキストボックスが空だったら全件表示したいのですが今10件しか出ません limitの書く場所が原因でしょうか? またこのように一覧画面と検索結果画面が一緒じゃまずいですかね? 検索結果を別ウインドウじゃなく自分に返したいと思いこのやり方にしたのですがよくないですか?

    • ベストアンサー
    • MySQL
  • php 分割

    以前はmysql関数をページングを行ったのですが、今回はpdoにやりたいけど pdoに書き換えるやり方がわかりません また前回は前のページ、次のページだったのですが 15件中 1-10件表示 ○ページ表示 と行い <前 1 2 3 次>みたいにやりたいです <html> <head> <title>一覧画面</title> </head> <body> <br><br> <blockquote> 一覧画面 <br><br> <form action = "" method="GET"> <input type="hidden" name="event" value="find"> <input type="text" name="name"style ="font-size:20px;width: 400px; height: 40px"> <input type="submit" value="検索" style ="font-size:20px;width: 100px; height: 40px"> </form> <br><br> <?php if ($_GET) { // データがGETされていたら $event = isset($_GET['event']) ? $_GET['event'] : ''; // 取得 } $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $name=isset($_GET['name'])?$_GET['name']:""; $perpage=10; $page=isset($_GET['page'])?($_GET['page']*$perpage):0; $sql ="select * from tbl_test where 1 "; $sql.="and (0 "; $sql.="or `氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.=") "; $sql.= " limit {$page},{$perpage}" ; $stmt = $pdo->prepare( $sql); $stmt->execute(array($name,$name)); $count = $stmt->rowCount(); if($count>0){ print "<table border=1>" ; print "<tr>"; print "<th>番号</th>"; print "<th>氏名</th>"; print "<th>住所</th>"; print "<th>操作</th>"; print "</tr>"; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td></tr>"; print "</tr>"; }; print "</table>" ; }else{ print "該当するデータがありません"; } ?> このソースにどう命令を入れていいのかわからず困っています サンプルソースや指摘おねがいします

    • ベストアンサー
    • PHP
  • PHP + PDOでデータ登録

    PHPでデータの登録を行っています いろいろ調べながら試行錯誤しています 登録できる条件があります 1.番号が重複じゃない 2.番号、氏名、住所が空白でない場合です 現状 1.2両方できていてデータも追加されるのですが、 2の条件、空白だった場合エラーメッセージを表示したいのですが表示されず困っています <?php $err = ""; if(empty($_POST['ID'])) $err.= "<br><br>番号入力してください。<br><br>"; if(empty($_POST['NAME'])) $err.= "<br><br>氏名入力してください。<br><br>"; if(empty($_POST['ADDR'])) $err.= "<br><br>住所を入力してください。<br><br>"; if(empty($err)) { $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "****"); $st = $pdo->prepare("INSERT INTO tbl_test VALUES(?,?,?)"); $st->execute(array($_POST['ID'], $_POST['NAME'],$_POST['ADDR'])); if($st->rowCount()>0) { header('Location: http://localhost/top.php'); }else{ print "既に登録している番号です"; } echo $err; } ?> 重複したときは"既に登録している番号です"と表示されるのですが、空白だった場合$errが表示されません

    • ベストアンサー
    • MySQL
  • sqlite3 group byがわかりません!!

    テーブル番号を入力すると、各テーブルごとの商品 数量 小計が表示されるようにしたいのですが、各テーブルの合計が表示できません。ご教授お願い致します! <?php $ban = $_POST['ban']; $kazu = $_POST['kazu']; $tno = $_POST['no']; //テーブル番号 $pdo = new PDO('sqlite:db/syouhin.db'); $st = $pdo->query("SELECT * FROM list WHERE tno='" . $_POST["no"] . "' "); while ($row = $st->fetch()) { $tno = htmlspecialchars($row['no']); $id = htmlspecialchars($row['id']); $name = htmlspecialchars($row['name']); $kin = htmlspecialchars($row['kin']); $kazu = htmlspecialchars($row['kazu']); $kei = htmlspecialchars($row['kei']); echo "<td>$id</td><td>$name</td><td>$kin</td><td>$kazu</td><td>$kei</td><tr>"; } $st = $pdo->query('SELECT sum(kei) as kei FROM list group by tno');//←tno( テーブル番号カラム名 if ($row = $st->fetch()) { $tno = htmlspecialchars($row['tno']); $gokei = number_format($row['kei']); echo '¥'."$gokei"; }

    • ベストアンサー
    • PHP
  • mysql

    一覧画面と検索画面を一緒にしています <!--一覧画面 index1.php--> <html> <head> <title>一覧画面</title> </head> <body> <br><br> <blockquote> 一覧画面 <br><br> <?php if ($_GET) { // データがGETされていたら $event = isset($_GET['event']) ? $_GET['event'] : ''; // 取得 if (isset ($_GET['page'])==false) { $page=0; } else { //そうでなければpageパラメータの値をpage変数にセット $page = $_GET['page']; } } ?> <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $name=isset($_GET['name'])?$_GET['name']:""; $sql ="select * from tbl_test where "; $sql.="`氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.= " limit " . $page*10 . ", 10" ; $stmt = $pdo->prepare( $sql); $stmt->execute(array($name,$name)); $count = $stmt->rowCount(); if($count>0){ print "<table border=1>" ; print "<tr>"; print "<th>番号</th>"; print "<th>氏名</th>"; print "<th>住所</th>"; print "<th>操作</th>"; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ print "</tr>"; $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td></tr>"; }; print "</table>" ; }else{ print "該当するデータがありません"; } ?> <br><br><br> <form action = "index1.php" method="GET"> <input type="hidden" name="event" value="find"> <input type="text" name="name"style ="font-size:20px;width: 400px; height: 40px"> <input type="submit" value="検索" style ="font-size:20px;width: 100px; height: 40px"> </form> <br><br> <form action = "regist.php" method="GET"> <input type="hidden" name="event" value="regist"> <input type = "submit" value = "新規登録" style ="font-size:20px;width: 100px; height: 40px"> </form> <input type="hidden" name="page" value="0"> </blockquote> </body> </html> limit10で10件表示にしています 検索のテキストボックスが空だったら全件表示したいのですが今10件しか出ません limitの書く場所が原因でしょうか? またこのように一覧画面と検索結果画面が一緒じゃまずいですかね? 検索結果を別ウインドウじゃなく自分に返したいと思いこのやり方にしたのですがよくないですか?

    • ベストアンサー
    • MySQL
  • sqlite3 検索、一行づつ増やして表示

    sqlite3接続で商品番号と数量を入力して検索表示させ小計を実行するphpで一行表示はOKなのですが、続けて検索させ一行ごと増やしていきたいのですがうまくできません!ご教授お願い致します。 <?php $kazu = $_POST['kazu']; $pdo = new PDO('sqlite:db/syouhin.db'); $st = $pdo->query("SELECT * FROM oder WHERE id='" . $_POST["ban"] . "' "); while ($row = $st->fetch()) { $id = htmlspecialchars($row['id']); $name = htmlspecialchars($row['name']); $kin = htmlspecialchars($row['kin']); $kei = number_format("$kin"*"$kazu"); echo "<tr><td>$id</td><td>$name</td><td>$kazu</td><td>$kin</td><td>$kei</td><tr>"; } sqlite_close; ?>

    • 締切済み
    • PHP
  • PDOでMySQL接続した際の文字化けについて

    http://ponk.jp/php/basic/php_mysql すいません。データベースを初めて勉強中なのですが、上記のサイトに書いてあるように文字をphpで表示させた場合日本語が???に文字化けします。いろいろググってみたのですが解決できず先に進めません・・。 照合順序などはutf8_general_ciとなっていまして、phpの方も<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />とutf-8が指定してありますので問題ないと思います。 考えられる原因というのはどんなものがありますか? テーブル表 CREATE DATABASE men; USE men; CREATE TABLE udon(name TEXT, price INT); INSERT INTO udon VALUES('たぬきうどん', 340); INSERT INTO udon VALUES('てんぷらうどん', 440); INSERT INTO udon VALUES('カレーうどん', 420); INSERT INTO udon VALUES('うどん定食', 520); 表示プログラム <table border="1"> <tr><th>名前</th><th>価格</th></tr> <?php $pdo = new PDO("mysql:dbname=men", "root"); $st = $pdo->query("SELECT * FROM udon"); while ($row = $st->fetch()) { $name = htmlspecialchars($row['name']); $price = htmlspecialchars($row['price']); echo "<tr><td>$name</td><td>$price 円</td></tr>"; } ?> </table>

    • ベストアンサー
    • MySQL
  • mysql データ表示

    下記のプログラムは詳細を選択すると選択されたデータをいま1件ずつ表示しているのですが 氏名と住所を編集できるようにテキストボックスにしたいまた選択されたデータを初期値として取りたいです 表示されるのですが入力できません どこにフォームなどの命令を入れればいいですか 全体表示のtop.php <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>一覧画面</title> </head> <body> <BLOCKQUOTE> <BR>一覧画面<BR><BR> <?php $con=mysqli_connect("localhost","root","admin","db_test"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $result = mysqli_query($con,"SELECT * FROM tbl_test"); echo "<table border='1'> <tr> <th>番号</th> <th>氏名</th> <th>住所</th> <th>詳細</th> </tr>"; while($row = mysqli_fetch_array($result)) { echo "<tr>"; echo "<td>" . $row['番号'] . "</td>"; echo "<td>" . $row['氏名'] . "</td>"; echo "<td>" . $row['住所'] . "</td>"; echo "<td><a href=\"exit.php?id=" . $row['番号'] . "\">詳細</a></td>"; echo "</tr>"; } echo "</table>"; mysqli_close($con); ?> <BR><BR><BR> <A HREF="http://localhost/regist.php"> <INPUT TYPE = "SUBMIT" VALUE = "新規登録"></A> </BLOCKQUOTE> </body> </html> 詳細表示の exit.php <html> <body> <table border='1'> <BR><BR> <tr> <th>番号</th> <th>氏名</th> <th>住所</th> </tr> <?php $id=(isset($_GET["id"]))?((int) $_GET["id"]):0; $con=mysqli_connect("localhost","root","admin","db_test"); $result = mysqli_query($con,"SELECT `番号`,`氏名`,`住所` FROM tbl_test where `番号`={$id}"); while($row = mysqli_fetch_array($result,MYSQLI_ASSOC)) { print "<tr>"; print "<td>".htmlspecialchars($row["番号"])."</td>"; print "<td>".htmlspecialchars($row["氏名"])."</td>"; print "<td>".htmlspecialchars($row["住所"])."</td>"; print "</tr>"; } ?> </table> <BR><BR> <A HREF="http://localhost/top.php"> <INPUT TYPE = "SUBMIT" VALUE = "一覧へ戻る"></A> </body> </html>