質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

963閲覧

PHP フォームにデータを指定して検索をしたいのですが、致命的エラーが表示される

kakko

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/11/15 11:33

編集2018/11/15 14:12
php ```` エラーメッセージ 致命的なエラー:26行目のC:\ develop \ pleiades \ xampp \ htdocs \ YPHPSample \ 11 \ Sample11-6.phpの非オブジェクトのメンバ関数bindParam()を呼び出します。 コールスタック です ### 該当のソースコード ```php ソースコード //前の例題分 表作成 エラーは表示されていません <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title>11-1</title> </head> <body> <?php $dbname= "sqlite:pdd.db"; $username= ""; $psword= ""; $db= new PDO($dbname,$username,$psword); $db->exec("DROP TABLE IF EXISTS product"); $db->exec("CREATE TABLE product(id INTEGER PRIMARY KEY,name STRING,price INTEGER)"); $qry=array( "INSERT INTO product (name, price) VALUES('鉛筆', 80)", "INSERT INTO product (name, price) VALUES('消しゴム', 50)", "INSERT INTO product (name, price) VALUES('定規', 200)", "INSERT INTO product (name, price) VALUES('コンパス', 300)", "INSERT INTO product (name, price) VALUES('ボールペン', 100)" ); foreach($qry as $value){ $db->exec($value); }$qry="SELECT * FROM product"; $data= $db->query($qry); ?> <table border="2"> <tr bgcolor="#AAAAAA"> <th>番号</th> <th>商品名</th> <th>単価</th> </tr> <?php while($value = $data->fetch()){ $id = $value["id"]; $name = $value["name"]; $price = $value["price"]; print "<tr><td>{$id}</td><td>{$name}</td><td>{$price}</td></tr>\n"; } $db = null; ?> </table> </body> </html> ``` ```html<!DOCTYPE html>````html //これから下がエラーがでている分 <html>` <head> <meta charset="UTF-8"/> <title>11-6</title> </head> <body> ``` ``` ```php <?php $dbname = "sqlite:pdb.db"; $usrname = ""; $psword = ""; $db = new PDO($dbname, $usrname, $psword); $word = null; if(isset($_POST["word"])) $word = $_POST["word"]; $qry = "SELECT * FROM product WHERE name LIKE:word"; $word = "%" . $word . "%"; $stmt = $db->prepare($qry); $stmt->bindParam(":word", $word); $stmt->execute(); ?> ``` ```html <table border="2"> <tr bgcolor="#AAAAAA"> <th>番号</th> <th>商品名</th> <th>単価</th> </tr> ``` ```php <?php error_reporting(E_ALL); ini_set('display_errors', '1'); while($value = $stmt->fetch()){ $id = $value["id"]; $name = $value["name"]; $price = $value["price"]; print "<tr><td>{$id}</td><td>{$name}</td><td>{$price}</td></tr>\n"; } $db = null; ?> ``` ```html </table> <form action="http://localhost/YPHPSample/11/Sample11-6.php" method="post"> <input type="text" name="word"/> <input type="submit" value="検索"/> </form> </body> </html> ``` ## 試したこと 表示したいもの 番号 商品名 単価 1 鉛筆 80 2 消しゴム 50 3 定規 200 4 コンパス 300 5 ボールペン 100   × 検索 試したこと いろいろ検索しました ここをみろとかいてありましたが何をいっているの内容自体がさっぱりわかりません すみませんが教えてください ### 補足情報(FW/ツールのバージョンなど) win7 XAAMPを使用してローカルで使用 書籍 やさしいphp P395 をみて学習

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/11/15 11:41

ソースコードはマークダウンのcode機能を利用してください
kakko

2018/11/15 12:11

了解しました 編集しなおします
kakko

2018/11/15 12:24

ヘルプをみましたがわかりませんでした、次回からの質問を気をつけます すみません
m.ts10806

2018/11/15 12:27

コード部分を選択状態にして<code>ボタンを押す。「ここに言語名を入力」となっている部分を「JavaScript」「html」など対応する言語名に修正
m.ts10806

2018/11/15 13:09

惜しいですね・・。PCであれば質問編集画面の右側にリアルタイムでプレビューが表示されるのでそちらを見ながら変なところはないか調整いただくとより良いです。でもだいぶ見やすくなりました。回答もしやすくなります。
m.ts10806

2018/11/15 13:16

PDOをnewした直後の$db を var_dump($db); とし、 $db->prepare($qry)の直後の$stmtをvar_dump($stmt);  とするとどういう出力になりますか?
kakko

2018/11/15 13:38 編集

コード修正しました あと表示されました object(PDO)[1] boolean false ( ! ) Fatal error: Call to a member function bindParam() on a non-object in C:\develop\pleiades\xampp\htdocs\YPHPSample\ 11\Sample11-6.php on line 27 Call Stack 何回も申し訳ないです
m.ts10806

2018/11/15 13:46

表示修正ありがとうございます。
kakko

2018/11/15 15:49

いろいろ教えてくださりありがとうございます
guest

回答2

0

ベストアンサー

PHP

1<?php 2$dbname = "sqlite:pdb.db"; 3$usrname = ""; 4$psword = ""; 5 6$db = new PDO($dbname); 7//追記 8$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 9 10try{ 11 12$word = null; 13 14if(isset($_POST["word"])) 15$word = $_POST["word"]; 16 17$qry = "SELECT * FROM product WHERE name LIKE:word"; 18$word = "%" . $word . "%"; 19$stmt = $db->prepare($qry); 20var_dump($stmt); 21$stmt->bindParam(":word", $word); 22$stmt->execute(); 23}catch(Exception $e){ 24 echo $e->getMessage(); 25 26}

こんな感じで例外を補足するようにするとエラーを表示出来るので、表示されたエラーを質問に追記してください。
多分、これより前の問題で用意している(であろう)DBのテーブルが無いとかそういう準備不足な気がします。
(その場合、書籍を持っていない人には回答出来ないので少し前の設問から順に試しなおしてみるなどが良いかなと思います。)

何も準備していない私の環境だと
SQLSTATE[HY000]: General error: 1 no such table: product
のように、productテーブルが無い旨エラーが表示されます。


追記

恐らく、直すだけな以下の様な感じでしょうか。

<?php <?php $dbname = "sqlite:pdb.db"; $usrname = ""; $psword = ""; $db = new PDO($dbname); $db->exec("DROP TABLE IF EXISTS product"); $db->exec("CREATE TABLE product(id INTEGER PRIMARY KEY,name STRING,price INTEGER)"); $qry=array( "INSERT INTO product (name, price) VALUES('鉛筆', 80)", "INSERT INTO product (name, price) VALUES('消しゴム', 50)", "INSERT INTO product (name, price) VALUES('定規', 200)", "INSERT INTO product (name, price) VALUES('コンパス', 300)", "INSERT INTO product (name, price) VALUES('ボールペン', 100)" ); foreach($qry as $value){ $db->exec($value); }$qry="SELECT * FROM product"; $data= $db->query($qry); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try{ $word = null; if(isset($_POST["word"])) $word = $_POST["word"]; $qry = "SELECT * FROM product WHERE name LIKE :word"; $word = "%" . $word . "%"; $stmt = $db->prepare($qry); var_dump($stmt); $stmt->bindParam(":word", $word); $stmt->execute(); while($value = $stmt->fetch()){ $id = $value["id"]; $name = $value["name"]; $price = $value["price"]; print "<tr><td>{$id}</td><td>{$name}</td><td>{$price}</td></tr>\n"; } }catch(Exception $e){ echo $e->getMessage(); }

投稿2018/11/15 13:30

編集2018/11/15 15:38
tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakko

2018/11/15 13:44

すみませんさっきコードマークを修正しました
tanat

2018/11/15 13:48

質問が見やすくなって良くなったと思いますが、質問のコードはPDOの例外(エラー)を補足できないあまりよろしくないコードです。(分かりやすいように敢えて省かれているのだとは思います) 回答のコードと比較してみて、追記されている部分を追記してみて例外を表示してみて下さい。
kakko

2018/11/15 14:14

前の例題分を追加しました
tanat

2018/11/15 15:00

エラーが出ている方の $dbname = "sqlite:pdb.db"; を $dbname = "sqlite:pdd.db"; に変更して、もしソースコードのフォルダがエラーが出ていないのと違うフォルダにあるのであれば同じフォルダに設置して実行してみて下さい
kakko

2018/11/15 15:21

解答ありがとうございます まだエラーがでています Fatal error: Call to a member function bindParam() on a non-object in C:\develop\pleiades\xampp\htdocs\YPHPSample\11\Sample11-6.php on line 27 もう一回最初から勉強しなおそうと思っています
tanat

2018/11/15 15:38

そうですね。 追記した回答でとりあえずは動くはずですが、それぞれの部分が何をしているかよくわからない状態であれば、無理に進むよりは少し戻って勉強しなおすのが良いと思います。
kakko

2018/11/15 15:48

できました ありがとうございます 一回前の例題を読み込んでからもう一回pddに変更したほうで表示したらちゃんとでました これってサンプルコードと本のミスってことなのでしょうか?
kakko

2018/11/15 15:48

夜おそくまでおつきあいくださりありがとうございます
tanat

2018/11/15 15:59

サンプルコードがどうなっているかわかりませんが、 11-6はpdd.dbが存在していて、データがある前提でないと動かないコードなので、 前の例題を実行した後に実行しないと動かないですね。 その辺りも意識して周辺の説明部分を読んでみると良いかもしれません。 また、書籍、サイトに限らずコードのミスというものはあるものなので、書籍であれば出版社や公式サイトの正誤表を確認しておくと良いです。
kakko

2018/11/15 16:16

前からのファイル?からみにいくので同じ名前でないとpc側からはよめなかったということですね・・・ そこまでよめなかった  すごいです
guest

0

$stmt->bindParam()でエラーってことは、$stmtの中身がダメなんじゃないかな。
その直前で、var_dump($stmt);とかやったらなにかわかるかもしれません。

ネット上で散見されるコード例を見ると
$db = new PDO($dbname);だけで良さそうな気がします。

投稿2018/11/15 11:49

編集2018/11/15 11:52
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakko

2018/11/15 12:13

ありがとうございます! ちょっとみてみます
kakko

2018/11/15 13:43

boolean false ( ! ) と表示されます 検索しましたがちょっとわからないです もうすこし前にもどって勉強したほうがいいのかも?内容がわからないんです
kakko

2018/11/15 15:52

ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問