• 締切済み

phpプリペアードステートメントについて質問です。

phpの練習で、以下のようなhtmlファイルとphpファイルを作り XAMPで作業をおこなっています。 以下にあるhtml.phpファイルでのやり取りはうまくいっているのですが、 このphpをプリペアードステートメントにする所で躓いています。 いろいろ調べてやってはみたものの、どうしても%を使った あいまい検索のところがわかりません。 ---------------------------------------------------------------- 以下、プリペアードステートメントにする前の ページ内容です。こちらではうまくいっています。 html <form method="post" action="kensaku.php"> ご意見コードを入力してください。<br /> <input name="code" type="text" style="width:100px"><br /> <br /> <input type="submit" value="送信"> </form> php <?php $code=$_POST['code']; $dsn = 'mysql:dbname=phpkiso;host=localhost'; $user = 'root'; $password =''; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); while(1) { $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { break; } print $rec['code']; print $rec['nickname']; print $rec['email']; print $rec['goiken']; print '<br />'; } $dbh = null; ?> ---------------------------------------------------------------- 以上のphpの中の以下の分を $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); ↓ $sql ="SELECT*FROM anketo WHERE goiken like ?"; $stmt = $dbh->prepare($sql); $data[] = $code; $stmt->execute(array("%$_GET[$data]%")); こんな風に直しては見たのですが、なんだか うまくい行かずです。 よろしければ教えてください。 宜しくお願い致します。

  • PHP
  • 回答数1
  • ありがとう数0

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

なにを参考にしていますか? まずはこのあたりで書式を再確認してみてください

参考URL:
http://www.php.net/manual/ja/pdo.prepare.php

関連するQ&A

  • プリペアードステートメント処理と特定レコードの表示

    ●質問の主旨 kensaku.htmlから数字(データベースのコード番号)を入力・検索して、 PHPMyAdminにあるデータベースから、特定のレコードを取り出したいと考えています ところが(ichiran.php)の$data[]=$code; コードについてNotice: Undefined variable: code と エラーが変え返されます。 検索窓に入力した特定のレコードの内容だけを 返すためには、下記のichiran.phpを, どのように直せばよいでしょうか? なお、質問:No.8014448と関連しています。 そのときプリペアードステートメント処理について指摘をいただきましたので、 その処理をいたしました。 http://okwave.jp/qa/q8014448.html ●プログラムの流れ 1.kensaku.htmlの検索窓に番号を入力・送信 2.PHPMyAdminにあるデータベース(aketo)にアクセス 3.ichiran.phpで検索結果を表示 ●プログラムコード (kensaku.html) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHPの基礎</title> </head> <body> <form method="post" action="check.php"> ニックネームを入力してください<br/> <input name="nickname" type="text" style="width:100px"><br/> メールアドレスを入力してください<br/> <input name="email" type="text" style="width:200px"><br/> ご意見を入力してください<br/> <input name="goiken" type="text" style="width:300px"><br/> <br/> <input type="submit" value="送信"> </form> </body> </html> (ichiran.php) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHPの基礎</title> </head> <body> <?php $dsn = 'mysql:dbname=phpkiso2;host=localhost'; $user = 'root'; $password = ''; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $sql = 'SELECT * FROM anketo WHERE code=?'; $stmt = $dbh->prepare($sql); $data[]=$code; $stmt->execute($data); while(1) { $rec = $stmt->fetch(PDO::FETCH_ASSOC); if($rec == false) { break; } print$rec['code']; print$rec['nickname']; print$rec['email']; print$rec['goiken']; print'<br/>'; } $dbh = null; ?> </body> </html> ●開発環境 windows8 xammp1.8.1 MySQL(PHPMyAdmin) ●参考文献 いきなりはじめるPHP~ワクワク・ドキドキの入門教室(P142) http://www.amazon.co.jp/%E3%81%84%E3%81%8D%E3%81%AA%E3%82%8A%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BPHP~%E3%83%AF%E3%82%AF%E3%83%AF%E3%82%AF%E3%83%BB%E3%83%89%E3%82%AD%E3%83%89%E3%82%AD%E3%81%AE%E5%85%A5%E9%96%80%E6%95%99%E5%AE%A4~-%E8%B0%B7%E8%97%A4%E8%B3%A2%E4%B8%80/dp/4897978858/ref=sr_1_1?ie=UTF8&qid=1364482924&sr=8-1

    • ベストアンサー
    • PHP
  • 特定のレコードだけを表示させるためのコード

    ●質問の主旨 kensaku.htmlから数字(データベースのコード番号)を入力・検索して、 PHPMyAdminにあるデータベースから、特定のレコードを取り出したいのですが、 データベースにあるすべてのデータが返されます。 検索窓に入力した特定のレコードの内容だけを 返すためには、下記のichiran.phpをどのように直せばよいでしょうか? ●プログラムの流れ 1.kensaku.htmlの検索窓に番号を入力・送信 2.PHPMyAdminにあるデータベース(aketo)にアクセス 3.ichiran.phpで検索結果を表示 ●プログラムコード (kensaku.html) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHPの基礎</title> </head> <body> <form method="post" action="kensaku.php"> ご意見コードを入力してください。<br/> <input name="code" type="text" style="width:100px"><br/> <br/> <input type="submit" value="送信"><br/> </body> </html> (ichiran.php) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHPの基礎</title> </head> <body> <?php $code=$_POST['code']; $dsn = 'mysql:dbname=phpkiso2;host=localhost'; $user = 'root'; $password = ''; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $sql = 'SELECT * FROM anketo WHERE code='.$code; $stmt = $dbh->prepare($sql); $stmt->execute(); $stmt->execute(); while(1) { $rec = $stmt->fetch(PDO::FETCH_ASSOC); if($rec == false) { break; } print$rec['code']; print$rec['nickname']; print$rec['email']; print$rec['goiken']; print'<br/>'; } $dbh = null; ?> </body> </html> ●開発環境 windows8 xammp1.8.1 MySQL(PHPMyAdmin)

    • ベストアンサー
    • MySQL
  • php ログインについて

    php ログインについて phpでログイン画面を作っているのですがログインできません。エラー等々もでず、「スタッフコードかパスワードが違います」になります。ちなみにDBにはスタッフのデータはしっかり存在します。 コードとパスワードを正しく入力しているにもかかわらずログインできません。 ソースはこちらです [staff_login.php] <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>ログイン</title> </head> <body> スタッフログイン<br/> <br/> <form method="post" action="staff_login_check.php"> スタッフコード<br/> <input type="text" name="code"><br/> パスワード<br/> <input type="password" name="pass"><br/> <br/> <input type="submit" value="ログイン"> </form> </body> </html> [staff_login_check.php] <?php try { $staff_code=$_POST['code']; $staff_pass=$_POST['pass']; $staff_code=htmlspecialchars($staff_code); $staff_pass=htmlspecialchars($staff_pass); $staff_pass=md5($staff_pass); $dsn='mysql:dbname=*****;host=********'; $user='*********'; $password='********'; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); $sql='SELECT name FROM mst_staff WHERE code=? AND password=?'; $stmt=$dbh->prepare($sql); $data[]=$staff_code; $data[]=$staff_pass; $stmt->execute($data); $dbh = null; $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { print'スタッフコードかパスワードが違います<br/>'; print'<a href="staff_login.html">戻る</a>'; } else { header('Location: staff_top.php'); } } catch(Exception $e) { print'エラーが発生しました'; exit(); } ?> 解決方法、ご指摘ございましたら教えていただきたいです。

    • ベストアンサー
    • PHP
  • 複数条件検索のWHERE句の使い方がわかりません。

    初めましてphp,mysql共に初心者です。 現在以下のような問題で頭を抱えています。 映画のデータベースを使った映画の検索システムを考えています。 フィールドはid,sakuhinmei,cast1,cast2,cast3,kantokuの6つです。 検索方法として作品名やキャストなどを一つのフォームを用いて検索する複数条件を用いたシステムを考えています。 そこで以下のようなソースを作りました。 <?php $dsn='mysql:dbname=testdb;host=localhost'; $user='root'; $password='koro0401'; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $kensakuwords=$_POST['kensakuwords']; $sql="SELECT * FROM eiga WHERE (sakuhinmei=.'$kensakuwords'.) OR (cast1=.'$kensakuwords'.) OR (cast2=.'$kensakuwords'.) OR (cast3 =.'$kensakuwords'.) OR (kantoku=.'$kensakuwords'.)"; $stmt=$dbh->prepare($sql); $stmt->execute(); while(1) { $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { break; } print$rec['id']; print$rec['sakuhinmei']; print$rec['cast1']; print$rec['cast2']; print$rec['cast3']; print$rec['kantoku']; print'<br/>'; } $dbh=null; ?> 実行してみるとエラーはでないのですが、何も表示されません。いろいろネットで調べてためしてはみたのですが、自分では何が違うのかわかりませんでした。 どうかphp、mysqlに詳しい方々、お力添えお願いします。 初心者でもわかりやすい解答をお願いします。

  • プリペアードステートメントの最終的なSQL文の確認

    プリペアードステートメントでSQLを実行しております。 プリペアードステートメントで最終的に実行されたSQL文を確認する方法はないでしょうか。 <実行SQL> $sql = "SELECT * FROM member where user = :username and password = :password and delflag ='0'"; $stmt = $this->db->prepare($sql); $flag = $stmt->execute(array(':username' => $user,':password' => $pass)); $passには、ユーザーから入力されたパスワード情報 $userには、ユーザーから入力されたユーザー名が入っております。 executeで実行された、$userの内容と$passwordの内容が埋め込まれ実行された 最終的な$SQL文を確認したいと思っています。 どのようにすれば確認できるものなのでしょうか。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • MDB2 プリペアードステートメントについて

    顧客情報管理システムを開発居しています。 下記のコードはMDB2を使用して、既に入力された情報を変更するための物をテストのため簡略化した物(のはず)ですが、$res = $sth -> execute ($data);の部分でエラーが発生してしまいます。 おそらくプリペアードステートメントの問題だと思い調べてみましたがお手上げです。。 知っている方からすればかなり馬鹿らしい間違いだと思いますが。。。 教えて下さい。 ちなみにmySQLを使用しています。 <?php //DBへの接続に必要な処理は完了し、$mdb2と言うオブジェクトは既に存在している。 $sql = "UPDATE customer_list SET name = ?,post = ?,address = ?,email = ? WHERE code = ?"; $typ = array("text","integer","text","text","integer"); $sth = $mdb2 -> prepare($sql,$typ); $data = array($_POST['name'],$_POST['post'],$_POST['add'],$_POST['email'],$_POST['code']); echo $data; $res = $sth -> execute ($data); ?>

    • ベストアンサー
    • PHP
  • PHPの書き方について

    PHPを独学で勉強中で、気になったことがあるので質問させていただきます。 最初に買った書籍とその次に買った書籍で書き方が違うところがあるので、普通はどちらでやるのか、また、使い分けがあるのかが知りたいです。 たとえば、データベースを1行ずつ取り出す処理で、1冊目では $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM ○○"; $stmt = $pdo->prepare($sql); $stmt->execute(null); $res = ""; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $res .= $row['△△'] ."," .$row['□□'] ."<br>\n"; } ・・・というコードがあったのですが、2冊目には同じような処理が mysqli_fetch_assoc()を使って書かれていたり、 接続の仕方も1冊目では「new PDO($dnsinfo,$USER,$PW);」を使って書かれているのが、2冊目では「mysqli_connect()」になっていたり、 他にも同じような処理がよく似たコードで書かれています。 調べてみると、PHP5.5から1冊目のやり方になった・・・ような記事を見つけたのですが、どちらの本もPHP5.5と書いてあり、いまいちよくわかりません。 詳しい方いらっしゃいましたらご教示お願いいたします。

    • ベストアンサー
    • PHP
  • 組み合わせのマッチィングを過去のものと重複させない

    ある研究の素材マッチングで過去に比較したものを重複させないでテストする組み合せを表示するプログラムを作りたいと思っています。 DB table tests id material test1 test2 test3 1 | A | 1 | 1 | 0 2 | B | 0 | 1 | 0 3 | D | 0 | 0 | 1 4 | E | 1 | 0 | 0 5 | F | 0 | 0 | 0 6 | G | 0 | 1 | 1 このテーブルによると素材Aはtest1とtest2に参加しておりそのどちらかに参加している素材B,素材Gとは再び同じtestに参加する必要がなく test1とtest2に参加していない素材D,素材Fはtest4で素材Aとマッチさせることができるという事を表示できるものを作りたいです。 考えましたのは、 $sql='SELECT material,test1,test2,test3 FROM tests WHERE id=?'; $stmt=$dbh->prepare($sql); $stmt->execute(array($id)); $rec=$stmt->fetch(PDO::FETCH_ASSOC); $material=$rec[material]; $test1=$rec[test1]; $test2=$rec[test2]; $test3=$rec[test3]; これでどの素材がどのテストに参加したかを求めその次のtest4でいままでマッチしていない素材のグループを作るには $material=$_POST[material]; $sql="SELECT material FROM tests WHERE $material !=? and test1 !=? and test2 !=? and test3 !=?"; $stmt=$dbh->prepare($sql); $stmt->execute(array($material,$test1,$test2,$test3)); while( $rec=$stmt->fetch(PDO::FETCH_ASSOC) ); $material=$rec[material]; { echo $material; echo '<br>'; } と言う形で書けるかと思うのですが、この方法ですとtest(testと素材の数は次々増えていきます)が増えるたびにデータベースのカラムを足しPHPのsql文を書き足さないといけなくなります。 カラムを増やしていく事があまりいい事ではない様に解釈しています。また都度PHPを書き足すのもどうかという事で設計上改善が必要かと思っていますがその改善案にたどり着くことができません。 なにかより良い設計(PHPの書き方、およびDB設計)がありましたらどうぞどなたかお知恵をお貸しください。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PDO で IN句を利用することができません

    PDOでIN句を使用しているのですが、正しく動作しません。 $stmt = $pdo->prepare('SELECT * FROM hoge where id in (?)'); $stmt->bindValue(1, '123, 456, 789'); $stmt->execute(); var_dump($stmt->fetchAll()); fetchAllを行っても複数のレコードがかえってこず、ヒットした最初の1行のレコードしか取得することができません。PDOでIN句を使用することはできないのでしょうか? DBMSはMySQLを使用して、PHPは5.2.6を使用しています。 ちなみに $stmt = $pdo->prepare('SELECT * FROM hoge where id in (?, ?, ?)'); $stmt->bindValue(1, 123); $stmt->bindValue(2, 456); $stmt->bindValue(3, 789); $stmt->execute(); では、fetchAll で複数のレコードが返ってきます。 どうしてもpreparedで単一のIN句を使いたいのですが、何か良い方法はありますでしょうか?

    • 締切済み
    • PHP
  • $dbh = dbConnect();

    いつもお世話になりありがとうございます。 標記の件。 エラーになります。 どう直せばいいでしょうか? エラーメッセージは Fatal error: Uncaught Error: Call to undefined function dbConnect() in C:\xampp\htdocs\blog_create.php:9 Stack trace: #0 {main} thrown in C:\xampp\htdocs\blog_create.php on line 9 です。 コーディングは下記です。 <?php //require_once('form.html'); require_once('blog.php'); $sql = "INSERT INTO table_name(name,title,category,content) VALUES (:name, :title, :category, :content,)"; $dbh = dbConnect(); $dbh->beginTransaction(); try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':id', $blogs['id'], PDO::PARAM_INT); $stmt->bindValue(':name', $blogs['name'], PDO::PARAM_STR); $stmt->bindValue(':title', $blogs['title'], PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], PDO::PARAM_STR); $stmt->bindValue(':post_at', $blogs['post_at'], PDO::PARAM_INT); $stmt->execute(); $stmt->commit(); echo 'ブログを投稿しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } blog.php <?php //require_once('dbc.php'); //<?php //class Dbc //{ // protected $table_name; //protected function dbConnect() //{ $dsn = 'mysql:host=localhost;dbname=blog_app;charset=utf8'; $user = 'blog_user'; $pass = 'rhythm0!KT'; try { $dbh = new \PDO($dsn, $user, $pass, [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo '接続失敗' . $e->getMessage(); exit(); }; return $dbh; //} function getAll() { $dbh = $this->dbConnect(); //①SQLの準備 $sql = "SELECT * FROM $this->table_name"; //②SQLの実行 $stmt = $dbh->query($sql); //③SQLの結果を受け取る $result = $stmt->fetchall(\PDO::FETCH_ASSOC); return $result; $dbh = null; } $dbh = $this->dbConnect(); $sql = "SELECT * FROM $this->table_name"; $stmt = $dbh->prepare("SELECT * FROM $this->table_name Where id = :id"); $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetch(\PDO::FETCH_ASSOC); if (!$result) { exit('本文がありません。'); } return $result; //} //function blogCreate($blogs) { $sql = 'INSERT INTO blog(title, content, category, publish_status) VALUES (:title, :content, :category, :publish_status)'; $dbh = $this->dbConnect(); $dbh->biginTransaction; try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':title', $blogs['title'], \PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], \PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], \PDO::PARAM_INT); $stmt->bindValue(':publish_status', $blogs['publish_status'], \PDO::PARAM_INT); $stmt->execute(); $dbh->commit(); echo 'ブログを投稿しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } } function delete($id) { if (empty($id)) { exit('idが不正です。'); } $dbh = $this->dbConnect(); $stmt = $dbh->prepare("DELETE FROM $this->table_name Where id = :id"); $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT); $stmt->execute(); echo 'ブログを削除しました!'; return $result; } //} ?> 度々申し訳ございません。 教えてください。 ご回答のほど宜しくお願い申し上げます。

    • ベストアンサー
    • PHP

専門家に質問してみよう