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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

2回答

1853閲覧

php mysql エラー解決したいです catch

daamasu

総合スコア12

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2018/09/04 13:10

編集2018/09/04 16:37

phpからmySQLのデータを2つの条件で絞り込み、表示したいのですがうまく行きません

php

1 <?php 2 try{ 3 $pdo = new PDO('mysql:host=localhost;dbname=db2;charset=utf8','root','root', 4 array(PDO::ATTR_EMULATE_PREPARES => false)); 5 6 $wide=$_POST['wide']; 7 $height=$_POST['height']; 8 echo "</br>"; 9 echo "入力内容"; 10 echo "</br>"; 11 echo "幅:"; 12 echo $wide; 13 echo "</br>"; 14 echo "高さ:"; 15 echo $height; 16 echo "</br>"; 17 18 19 //db検索 20 if( $wide == '未選択' && $height == '未選択' ){ 21 //両方未選択 22 echo '両方未選択でした。'; 23 $sql2="SELECT * FROM db2"; 24 $stmt=$pdo->prepare($sql2); 25 $stmt=bindValue(':wide',$wide); 26 $stmt=bindValue(':height',$height); 27 $stmt->execute(); 28 $count=$stmt->rowCount(); 29 print "ヒット件数".$count."件です。"; 30 echo "</br>"; 31 } 32 else if( $wide == "未選択" ){ 33 $sql2="SELECT * FROM db2 WHERE height = :height"; 34 $stmt=$pdo->prepare($sql2); 35 $stmt=bindValue(':height', $height); 36 $stmt->execute(); 37 $count=$stmt->rowCount(); 38 print "ヒット件数".$count."件です。"; 39 echo "</br>"; 40 } 41 42 else if( $height =='未選択'){ 43 $sql2="SELECT * FROM db2 WHERE wide = :wide"; 44 $stmt=$pdo->prepare($sql2); 45 $stmt=bindValue(':wide', $wide); 46 $stmt->execute(); 47 $count=$stmt->rowCount(); 48 print "ヒット件数".$count."件です。"; 49 echo "</br>"; 50 } 51 52 53 else { 54 $sql2="SELECT * FROM db2 WHERE wide = :wide AND height = :height"; 55 $stmt=$pdo->prepare($sql2); 56 $stmt=bindValue(':wide',$wide); 57 $stmt=bindValue(':height',$height); 58 $stmt->execute(); 59 $count=$stmt->rowCount(); 60 print "ヒット件数".$count."件です。"; 61 echo "</br>"; 62 } 63 } 64?> 65<?php 66 foreach($stmt as $row): 67 ?> 68 <img src="<?php echo $row['pic'] ?>"> 69 <?php 70 echo $row['brand'].' '.$row['name'].'価格:'.$row['price']; 71 ?> 72 <a href="<?php $row['url'] ?>">yahoo ショッピングでみる</a> 73 <a href="<?php $row['url'] ?>">楽天市場でみる</a> 74 <?php endforeach ?> 75 76 <?php catch (PDOException $e) { 77 var_dump($e); 78 exit('データベース接続失敗。'.$e->getMessage()); 79 } 80 ?>

というようにすると表示ができません。(画面が真っ白)ですが、

php

1<?php 2 try{ 3 $pdo = new PDO('mysql:host=localhost;dbname=db2;charset=utf8','◯','◯', 4 array(PDO::ATTR_EMULATE_PREPARES => false)); 5 6$wide=$_POST['wide']; 7 $height=$_POST['height']; 8 echo "</br>"; 9 echo "入力内容"; 10 echo "</br>"; 11 echo "幅:"; 12 echo $wide; 13 echo "</br>"; 14 echo "高さ:"; 15 echo $height; 16 echo "</br>"; 17 18 19 //db検索 20 if( $wide == '未選択' && $height == '未選択' ){ 21 //両方未選択 22 echo '両方未選択でした。'; 23 $sql2="SELECT * FROM db2"; 24 $stmt=$pdo->prepare($sql2); 25 $stmt=bindValue(':wide',$wide); 26 $stmt=bindValue(':height',$height); 27 $stmt->execute(); 28 $count=$stmt->rowCount(); 29 print "ヒット件数".$count."件です。"; 30 echo "</br>"; 31 } 32 else if( $wide == "未選択" ){ 33 $sql2="SELECT * FROM db2 WHERE height = :height"; 34 $stmt=$pdo->prepare($sql2); 35 $stmt=bindValue(':height', $height); 36 $stmt->execute(); 37 $count=$stmt->rowCount(); 38 print "ヒット件数".$count."件です。"; 39 echo "</br>"; 40 } 41 42 else if( $height =='未選択'){ 43 $sql2="SELECT * FROM db2 WHERE wide = :wide"; 44 $stmt=$pdo->prepare($sql2); 45 $stmt=bindValue(':wide', $wide); 46 $stmt->execute(); 47 $count=$stmt->rowCount(); 48 print "ヒット件数".$count."件です。"; 49 echo "</br>"; 50 } 51 52 53 else { 54 $sql2="SELECT * FROM db2 WHERE wide = :wide AND height = :height"; 55 $stmt=$pdo->prepare($sql2); 56 $stmt=bindValue(':wide',$wide); 57 $stmt=bindValue(':height',$height); 58 $stmt->execute(); 59 $count=$stmt->rowCount(); 60 print "ヒット件数".$count."件です。"; 61 echo "</br>"; 62         63 // catchをこの部分に持って来ます。 64 }catch (PDOException $e) { 65 var_dump($e); 66 exit('データベース接続失敗。'.$e->getMessage()); 67 } 68 } 69 70 71 72 //絞り込んだ情報を表示します 73 <?php 74 foreach($stmt as $row): 75 ?> 76 <img src="<?php echo $row['pic'] ?>"> 77 <?php 78 echo $row['brand'].' '.$row['name'].'価格:'.$row['price']; 79 ?> 80 <a href="<?php $row['url'] ?>">yahoo ショッピングでみる</a> 81 <a href="<?php $row['url'] ?>">楽天市場でみる</a> 82 <?php endforeach ?> 83 84 85 86 87

という感じでcatchをtryの後に持って来るとプログラムは処理されますがforeach文の部分が反応しません。
ご迷惑をかけて申し訳ありませんでした。
宜しくお願いいたします。

php

1<?php 2 try{ 3 $pdo = new PDO('mysql:host=localhost;dbname=db2;charset=utf8','◯','◯', 4 array(PDO::ATTR_EMULATE_PREPARES => false)); 5 6$wide=$_POST['wide']; 7 $height=$_POST['height']; 8 echo "</br>"; 9 echo "入力内容"; 10 echo "</br>"; 11 echo "幅:"; 12 echo $wide; 13 echo "</br>"; 14 echo "高さ:"; 15 echo $height; 16 echo "</br>"; 17 18 19 //db検索 20 if( $wide == '未選択' && $height == '未選択' ){ 21 //両方未選択 22 echo '両方未選択でした。'; 23 $sql2="SELECT * FROM db2"; 24 $stmt=$pdo->prepare($sql2); 25 $stmt=bindValue(':wide',$wide); 26 $stmt=bindValue(':height',$height); 27 $stmt->execute(); 28 $count=$stmt->rowCount(); 29 print "ヒット件数".$count."件です。"; 30 echo "</br>"; 31 } 32 else if( $wide == "未選択" ){ 33 $sql2="SELECT * FROM db2 WHERE height = :height"; 34 $stmt=$pdo->prepare($sql2); 35 $stmt=bindValue(':height', $height); 36 $stmt->execute(); 37 $count=$stmt->rowCount(); 38 print "ヒット件数".$count."件です。"; 39 echo "</br>"; 40 } 41 42 else if( $height =='未選択'){ 43 $sql2="SELECT * FROM db2 WHERE wide = :wide"; 44 $stmt=$pdo->prepare($sql2); 45 $stmt=bindValue(':wide', $wide); 46 $stmt->execute(); 47 $count=$stmt->rowCount(); 48 print "ヒット件数".$count."件です。"; 49 echo "</br>"; 50 } 51 52 53 else { 54 $sql2="SELECT * FROM db2 WHERE wide = :wide AND height = :height"; 55 $stmt=$pdo->prepare($sql2); 56 $stmt=bindValue(':wide',$wide); 57 $stmt=bindValue(':height',$height); 58 $stmt->execute(); 59 $count=$stmt->rowCount(); 60 print "ヒット件数".$count."件です。"; 61 echo "</br>"; 62         63 // catchをこの部分に持って来ます。 64 }catch (PDOException $e) { 65             //ここにエラー表示を持って来ました 66              ini_set('display_errors', "On"); 67 var_dump($e); 68 exit('データベース接続失敗。'.$e->getMessage()); 69 } 70 } 71 72 73 74 //絞り込んだ情報を表示します 75 <?php 76 foreach($stmt as $row): 77 ?> 78 <img src="<?php echo $row['pic'] ?>"> 79 <?php 80 echo $row['brand'].' '.$row['name'].'価格:'.$row['price']; 81 ?> 82 <a href="<?php $row['url'] ?>">yahoo ショッピングでみる</a> 83 <a href="<?php $row['url'] ?>">楽天市場でみる</a> 84 <?php endforeach ?> 85 86 87 88 89

エラー表示を入れましたが何も変わりませんでした

html

1 2<form action="◯.php" method="POST"> 3 <p> 4 <select name="wide"> 5 <option value="未選択">選択して下さい</option> 6 <option value="狭い">狭い</option> 7 <option value="やや狭い">やや狭い</option> 8 <option value="標準">標準</option> 9 <option value="やや広い">やや広い</option> 10 <option value="広い">広い</option> 11 </select> 12 13 <h2>高さ</h2> 14 <select name="height"> 15 <option value="未選択">選択して下さい</option> 16 <option value="低い">低い</option> 17 <option value="やや低い">やや低い</option> 18 <option value="標準">標準</option> 19 <option value="やや高い">やや高い</option> 20 <option value="やや高い">やや高い</option> 21 </select> 22 </p> 23 <p><input type="submit" value="検索"></p> 24 </form> 25 26```エラー内容 27Fatal error: Uncaught Error: Call to undefined function bindValue() in /Applications/MAMP/htdocs/size.php:79 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/size.php on line 79 28とかいてありましたが解決方法が判りません。 2979行目が```php 30else { 31 $sql2="SELECT * FROM db2 WHERE wide = :wide AND height = :height"; 32 $stmt=$pdo->prepare($sql2); 33//ここが79行目でした $stmt=bindValue(':wide', $wide); 34 $stmt=bindValue(':height',$height); 35 $stmt->execute(); 36 $count=$stmt->rowCount(); 37 print "ヒット件数".$count."件です。"; 38 echo "</br>"; 39 }

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

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

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

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

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

m.ts10806

2018/09/04 13:27 編集

省略が多すぎるため全体の流れが掴みづらいです。例えば$stmtという変数には何がどう入っているのか、とか。再現確認もとれないのでもう少しコードを提示いただけますか? インデントも揃えられた方が良いです。画面真っ白は処理継続が不可能なエラーが出てそこで処理が中断してしまっていることが殆どです。エラー表示がOffになっていると真っ白になります。エラー表示をOnにしてエラーを確認してください。https://qiita.com/shotets/items/3c95aef631b2c5eadae5 でないと「エラー解決したい」というタイトルのわりにエラー内容が提示されていないので「あれ?」となってしまいます。
退会済みユーザー

退会済みユーザー

2018/09/04 13:25 編集

https://teratail.com/questions/144770 先の質問に付け足した内容を改めて質問として起こしたようですね。じゃぁ向こうの質問はさっさとクローズしてほしいものです。複数箇所で同じ話題を議論する不毛さをご理解ください。
m.ts10806

2018/09/04 13:26

質問は編集できるので新しい質問をたてるのではなく質問を編集して対応してください。もし解決した質問があれば「ベストアンサー」を選ぶか自分で回答を書いてその回答をベストアンサーに選び「自己解決」としてください。
daamasu

2018/09/04 13:30

迷惑をかけてすいませんでした。
m.ts10806

2018/09/04 13:34

ひとつひとつ対応して、解決していければ良いと思いますよ。
m.ts10806

2018/09/04 14:19

タイトル修正されるか質問にエラーを追記してください。タイトルに「エラー解決したい」とあるのにエラー文が提示されていません。
m.ts10806

2018/09/04 14:22

ちなみにini_set('display_errors', "On");は冒頭に置くものです。
guest

回答2

0

ベストアンサー

$stmt=bindValueではなく$stmt->bindValue

投稿2018/09/05 09:29

papinianus

総合スコア12705

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

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

m.ts10806

2018/09/05 09:40

自分も間違えて書いてました^^;
daamasu

2018/09/05 09:56

ありがとうございます。おかげさまで解決できました
guest

0

execute()したのであればfetch()で取り出すものかと思います。
foreachで取り出したいならfetchAll()ですかね。

以下、気になった点です。
・「未選択」のときもbindValue()していますが、これは不要では?
未検証ですが、指定したbind先のnameがないのでエラー出そう。
・if-elseがかなり冗長。検索条件を配列に入れておいて、ある分だけセットすれば結構短くできるのでは?

「未選択の場合はWhereなし。未選択でなければANDで完全一致」として
例えば:※未検証なので実装イメージ

php

1//ここ$_POSTそのままだと無駄なループ発生するので本来はもう少し工夫したほうが良いです 2 3$bind = []; //bind用 4$where = []; //where句用 5foreach($_POST as $name=>$value){ 6 if(($name === "wide" || $name === "height") && $value !== "未選択"){ 7 $where[] = $name."=:".$name; 8 $bind[$name] = $value; 9 } 10} 11 12$sql = "SELECT * FROM db2"; 13if(count($where) > 0){ //未選択以外を連結してWhereに 14 $sql .= " WHERE ".implode(" AND ".$where); 15} 16$stmt=$pdo->prepare($sql); 17foreach($bind as $name=>$value){ //未選択以外をBind 18 $stmt->bindValue(':'.$name,$value); 19} 20$stmt->execute();

投稿2018/09/04 14:15

編集2018/09/05 09:41
m.ts10806

総合スコア80850

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

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

daamasu

2018/09/04 14:36

返信ありがとうございます。 htmlも表示しましたのでご教授お願いします
m.ts10806

2018/09/04 14:40

回答読んだうえで、アドバイス通り試して見られたのでしょうか。 m6uさんの前の回答・コメントについても私は同じことを幾つかコメントしていますが、どこまで理解されたのでしょうか。 あまり(というかほとんど)対応された形跡がないので一歩も進んでないように思います。
daamasu

2018/09/04 16:38

理解しきっていません。エラー内容が表示することはできました
m.ts10806

2018/09/05 05:34 編集

理解しきっていないのに次の質問立てたのですか? 前の質問の回答者に大変失礼なことをしていると思います。 全て理解しろとは言いませんがせめて分からないところと分かっているところを明確にして確実に解決していくように(分からないところを潰していくように)してください エラーの意味を調べたり、エラーで検索したりしましたか? エラーメッセージは結構親切で、何がいけないかちゃんと教えてくれてますし、同じエラーメッセージで困った人は過去にたくさんいるはずなので、いつ返事があるか分からないネット上で赤の他人に聞くよりも調べた方が早いです。
daamasu

2018/09/05 09:34

自分で書いたコードはある程度理解できていましたが、mtsさんにかいていただいたコードが理解しきっていませんでした。
m.ts10806

2018/09/05 09:44

一部質問者さんのコードの間違った部分をそのままコピーして使っていた部分を修正しました。失礼しました。 ところで、コメント前半にしか着目されていない返信が目立ちますが、全文読まれてますか? コードよりもまずきちんとコメントを読解されるのが先かと思います。何度も同じことを言わせるのはトラブルの元です。
m.ts10806

2018/09/05 09:55 編集

「理解しきっていない」だけではあなたがどれくらい理解してるか伝わりません。 なのでこちらもどうアドバイスしていいか分かりません。具体的に記載してください。 具体的であればあるほどお互いストレスなく進み、解決が早まります。(相談などをするときの基本ですが、相手の時間も浪費している認識を持ちましょう)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問