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

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

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

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

Q&A

解決済

4回答

1941閲覧

PHP

marimokomokmOk

総合スコア52

PHP

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

0グッド

0クリップ

投稿2017/02/23 06:24

編集2017/02/23 08:35

PHPでエラーが起きてしまいました。
何故でしょうか。

if(isset($_POST['command']) && !$_POST['command'] == 'search'){ echo "foreach ($pdo->query('select * from words order by id desc') as $row){"; }

こちらを追加してからです。

Parse error: syntax error, unexpected end of file in /home/takahashi/public_html/test28.php on line 233Parse error: syntax error, unexpected end of file in /home/takahashi/public_html/test28.php on line 233

http://pastebin.com/kLya9muL
↑このサイトにコードがあります

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/02/23 06:47

何を目的としてそのコードを追加したのか。phpからphpのコードを生成しているように見えますけど。
masaya_ohashi

2017/02/23 07:16

ツッコミどころが多すぎてどうしていいのかわかりません…commandがsearchでないときは全件表示、searchのときはkeywordで絞り込んで表示、という仕様であっていますか?
kei344

2017/02/23 08:22

質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。また、ここにコードがある、というのであればURLだけでなくリンクぐらい貼ってください。
marimokomokmOk

2017/02/24 03:27

if(isset($_POST['command']) || !$_POST){
guest

回答4

0

ベストアンサー

213行目から227行目までを以下に置き換えてください。

PHP

1 break; 2 } 3 if(!$_POST['command'] == 'search'){ 4 $sql = $pdo->query('select * from words order by id desc'); 5 } 6 foreach ($sql->fetchAll() as $row){ 7 echo '<tr>'; 8// echo '<td width="30" height="35" align="center" width="110" height="35">', h($row['id']), '</td>'; 9 echo '<td class="font3"><b>', h($row['word']), '</b></td>'; 10 echo '<td width="150" class="font3">', h($row['sense']), '</td>'; 11 echo '<td width="150" class="font3">', h($row['memo']), '</td>'; 12 echo '</tr>'; 13 echo "\n"; 14 }

1つ1つツッコミます。

もとのコードの213〜215行目

PHP

1 foreach ($sql->fetchAll() as $row){ 2 break; 3 }

おそらく直前の処理を見るに、このfetchAllで得られる行は「検索対象としてひっかかった行」のはずです。それを画面にechoで出すはずが、for文の頭でいきなりbreakしているのでこのforは即終了です。それどころか215行目でforが閉じられているので、breakを消しても空ループが回るだけでなにも起きません。
breakはswitchにも使いますが、forやforeachにも使います。そして、優先されるのはそのbreakが書かれた場所に一番近いものです。つまり、switchを抜けるのではなくforeachを抜けます。

もとのコードの216行目

PHP

1if(isset($_POST['command']) && !$_POST['command'] == 'search'){

すでにこのswitch文に入る前に$_POSTの存在チェック、commandの有無がチェック済みであるため、searchでないことを確認するだけで済みます。

もとのコードの217行目

PHP

1 echo "foreach ($pdo->query('select * from words order by id desc') as $row){";

なぜPHPコードをechoで画面に出そうとしたのですか?おそらくsearchでないときは全件表示したいから、trの出力部分をsearchでないときだけやりたい、ということなのでしょうが、そんな書き方はできません。226行目のあたりも同じです。

新しいコードの解説

PHP

1 break; 2 }

まずswitch内のsearchの処理は$sqlを得るだけでfetchAllせずにbreakで抜けます。こうすることで以後の処理に$sqlを持ち越すことができます。

PHP

1 if(!$_POST['command'] == 'search'){ 2 $sql = $pdo->query('select * from words order by id desc'); 3 }

searchでないときだけ、$pdo->queryで全件検索する結果を$sqlに入れます。これで、searchのときは絞り込み結果、そうでないときは全件のデータが$sqlに入ることになります。

PHP

1 foreach ($sql->fetchAll() as $row){ 2 echo '<tr>'; 3// echo '<td width="30" height="35" align="center" width="110" height="35">', h($row['id']), '</td>'; 4 echo '<td class="font3"><b>', h($row['word']), '</b></td>'; 5 echo '<td width="150" class="font3">', h($row['sense']), '</td>'; 6 echo '<td width="150" class="font3">', h($row['memo']), '</td>'; 7 echo '</tr>'; 8 echo "\n"; 9 }

あとは出力したい形はsearchでもsearchでなくても同じなので、fetchAllで取れる件数が絞込後なのか、全件なのかしか違いはないため、この処理だけで同じことができるはずです。

投稿2017/02/23 07:35

masaya_ohashi

総合スコア9206

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

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

marimokomokmOk

2017/02/24 02:19

ご解答下さりありがとうございます。 大変参考になります。わかりやすいです。 一覧表示ボタン押したら、 Fatal error: Call to a member function fetchAll() on null in /home/takahashi/public_html/test29.php on line 218 というエラーがでてしまいました。
masaya_ohashi

2017/02/24 04:14

test29.phpというファイルは私は知らないので答えようがありません…
masaya_ohashi

2017/02/24 04:15

とりあえずわかることは、fetchAll()を呼び出した(おそらく)$sqlにnullが入っていることです。
marimokomokmOk

2017/02/24 09:44

ありがとうございます。 masaya_ohashiさんの回答をみてよく考えて見ます。
marimokomokmOk

2017/02/24 09:58

すみません、test29.phpはtest28.phpの中身をtest29.phpにコピペしました。 test29.phpとtest28.phpは同じです。 何故一覧ボタン押すとエラーになるのか不明です。 http://pastebin.com/iXHJqX50 ↑ test29.phpのコード
masaya_ohashi

2017/02/28 04:58

このコードと、エラーが出たときのコードは全く一緒ですか?あなたの貼り付けたエラーメッセージと、見せて頂いたtest29.phpの内容が一致しないように思います。
guest

0

if(isset($_POST['command']) && !$_POST['command'] == 'search'){

echo "foreach ($pdo->query('select * from words order by id desc') as $row){";
}

の部分だけのはなしであればパースしないようにnowdocを使ってみてはいかがでしょうか?

PHP

1if(isset($_POST['command']) && !$_POST['command'] == 'search'){ 2echo <<<'eof' 3foreach ($pdo->query('select * from words order by id desc') as $row){ 4eof; 5}

投稿2017/02/23 07:21

yambejp

総合スコア114572

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

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

0

インデントを正して見てください。そうすればなぜこのエラーが起きるかわかるでしょう。コードが統一されていないと、{}のペアの位置がずれていてこういうミスが起きます。

投稿2017/02/23 06:58

編集2017/02/23 07:26
masaya_ohashi

総合スコア9206

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

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

0

まだクローズしていないのかな。。と想像コメントしますね。

Parse error: syntax error, unexpected end of file
↑これをインタネットで検索すると原因は解決すると思いますよ。

コードの記述間違いをいっしょに探してください。
はちょっとよくないかな。

投稿2017/02/23 07:11

kometaroimo

総合スコア76

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問