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

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

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

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

PHP

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

Q&A

2回答

1293閲覧

PHPエラーについて(Array ([0] => 00000)

torinoto7

総合スコア19

MySQL

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

PHP

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

0グッド

2クリップ

投稿2018/10/14 11:06

編集2018/10/15 12:55

複数の簡易掲示板を作成しています。
一つ目の掲示板はエラーもなく動作しているのですが、
二つ目の掲示板を作成したら動作はしているのですが、下記のエラーがあります。
一つ目の掲示板はうまく動作しているのに二つ目は何故エラーになるのか分からないです。
コードにまだ慣れていなくどこに記載をしたら良いのか分からないです。
宜しくお願いします。

エラー:Array ([0] => 00000[1] =>[2] => )

イメージ説明

【コード追記・修正箇所】
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die ('エラー:' . $e->getMessage() . "\n" . $e->getTraceAsString());
}

$stmt = $db->prepare("
INSERT INTO bbs1 (name, title, body, date )
VALUES (?, ?, ?, now() )"
);

(write1.php)

PHP

1 2<?php 3 4 // エラー表示 5error_reporting(E_ALL); 6ini_set('display_errors', '1'); 7 8 // データの受け取り 9 $name = $_POST['name']; 10 $title = $_POST['title']; 11 $body = $_POST['body']; 12 13 //必須項目チェック(名前か本文が空ではないか?) 14 if ($name == '' || $body == ''){ 15 header('Location: fot.php'); // fot.phpへ移動 16 exit(); //終了 17} 18 //データベースに接続 19 $dsn = 'mysql:host=localhost;dbname=db11;charset=utf8'; 20 $user = 'db11user'; 21 $password = '1111'; // 設定したパスワード 22 23try { 24 $db = new PDO($dsn, $user, $password); 25 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 26 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 27} catch (PDOException $e) { 28 die ('エラー:' . $e->getMessage() . "\n" . $e->getTraceAsString()); 29} 30 31 $stmt = $db->prepare(" 32 INSERT INTO bbs1 (name, title, body, date ) 33 VALUES (?, ?, ?, now() )" 34 ); 35 36 //パラメータを割り当て 37 $stmt->bindParam(1, $name, PDO::PARAM_STR); 38 $stmt->bindParam(2, $title, PDO::PARAM_STR); 39 $stmt->bindParam(3, $body, PDO::PARAM_STR); 40 41 //クエリの実行 42 $stmt->execute(); 43 44 //fot.phpに戻る 45 header('Location: fot.php'); 46 exit(); 47 48?>

DB一覧。
イメージ説明

(fot.html)

PHP

1 2<!-- ここから掲示板1 --> 3<?php 4 // 1ページに表示されるコメントの数 5 $num = 3; 6 7 //データベースに接続 8 $dsn = 'mysql:host=localhost;dbname=db11;charset=utf8'; 9 $user = 'db11user'; 10 $password = '1111'; //DBパスワード 11 12 //ページ数が指定されているとき 13 $page = 0; 14 if (isset($_GET['page']) && $_GET['page'] > 0) { 15 $page = intval($_GET['page']) -1; 16 } 17 18try { 19 $db = new PDO($dsn, $user, $password); 20 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 21 //プリペアドステートメントを作成 22 $stmt = $db->prepare( 23 "SELECT * FROM bbs ORDER BY date DESC LIMIT 24 :page, :num" 25 ); 26 //パラメータを割り当て 27 $page = $page * $num; 28 $stmt->bindParam(':page', $page, PDO::PARAM_INT); 29 $stmt->bindParam(':num', $num, PDO::PARAM_INT); 30 //クエリの実行 31 $stmt->execute(); 32} catch(PDOException $e){ 33 echo "エラー:" . $e->getMessage(). "\n" . $e->getTraceAsString(); 34} 35 36?> 37 <div id="nav-drawer"><!-- ハンバーガー --> 38 <input id="nav-input" type="checkbox" class="nav-unshown"> 39 <label id="nav-open" for="nav-input"> 40 <img src="img/a.jpg" class="fot"> 41 </label><span></span> 42 <label class="nav-unshown" id="nav-close" for="nav-input"></label> 43 <div id="nav-content"> 44 <div align="center"> 45 <img src="img/a.jpg" width="550" height="400"> 46 <br>コメント入力 47 48 <?php 49 while ($row = $stmt->fetch()): 50 $title = $row['title'] ? $row['title'] : '(無題)'; 51?> 52 <p>名前:<?php echo $row['name'] ?></p> 53 <p>タイトル:<?php echo $title ?></p> 54 <p><?php echo nl2br($row['body'], false) ?></p> 55 <p><?php echo $row['date'] ?></p> 56<?php 57 endwhile; 58 59 //ページ数の表示 60 try { 61 //プリペアドステートメント作成 62 $stmt = $db->prepare("SELECT COUNT(*) FROM bbs"); 63 //クエリ 64 $stmt->execute(); 65 } catch (PDOException $e){ 66 echo "エラー:" . $e->getMessage(). "\n" . $e->getTraceAsString(); 67 } 68 69 //コメントの件数を取得 70 $comments = $stmt->fetchColumn(); 71 //ページ数を計算 72 $max_page = ceil($comments / $num); 73 echo '<p>'; 74 for ($i = 1; $i <= $max_page; $i++){ 75 echo '<a href="fot.php?page=' . $i . '">' . $i . 76 '</a>&nbsp;'; 77 } 78 echo '</p>'; 79?> 80 </span> 81 82<span class="form"> 83 <form action="write.php" method="post"> 84 <p>名前:<input type="text" name="name"></p> 85 <p>タイトル:<input type="text" name="title"></p> 86 <textarea name="body"></textarea> 87 <p><input type="submit" value="書き込む">&nbsp;&nbsp;<input type="reset" value="リセット"></p> 88 </form> 89 </span><!-- form --> 90 </div><!-- nav-content終了 --> 91 </div><!-- ハンバーガー --> 92 93<!-- ここから掲示板2 --> 94 95<?php 96 // 1ページに表示されるコメントの数 97 $num = 3; 98 99 //データベースに接続 100 $dsn = 'mysql:host=localhost;dbname=db11;charset=utf8'; 101 $user = 'db11user'; 102 $password = '1111'; //DBパスワード 103 104 //ページ数が指定されているとき 105 $page = 0; 106 if (isset($_GET['page']) && $_GET['page'] > 0) { 107 $page = intval($_GET['page']) -1; 108 } 109 110try { 111 $db = new PDO($dsn, $user, $password); 112 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 113 //プリペアドステートメントを作成 114 $stmt = $db->prepare( 115 "SELECT * FROM bbs1 ORDER BY date DESC LIMIT 116 :page, :num" 117 ); 118 //パラメータを割り当て 119 $page = $page * $num; 120 print_r($db->errorInfo()); 121 $stmt->bindParam(':page', $page, PDO::PARAM_INT); 122 $stmt->bindParam(':num', $num, PDO::PARAM_INT); 123 //クエリの実行 124 $stmt->execute(); 125} catch(PDOException $e) { 126 echo "エラー:" . $e->getMessage(). "\n" . $e->getTraceAsString(); 127} 128?> 129 130 <div id="nav-drawer1"><!-- ハンバーガー --> 131<input id="nav-input1" type="checkbox" class="nav-unshown1"> 132 <label id="nav-open1" for="nav-input1"> 133 <img src="img/a.jpg" class="fot"> 134 </label><span></span> 135 <label class="nav-unshown1" id="nav-close1" for="nav-input1"></label> 136 <div id="nav-content1"> 137<img src="img/a.jpg" width="550" height="400"> 138 <br>コメント入力 139 140<?php 141 while ($row = $stmt->fetch()): 142 $title = $row['title'] ? $row['title'] : '(無題)'; 143?> 144 <p>名前:<?php echo $row['name'] ?></p> 145 <p>タイトル:<?php echo $title ?></p> 146 <p><?php echo nl2br($row['body'], false) ?></p> 147 <p><?php echo $row['date'] ?></p> 148<?php 149 endwhile; 150 151 //ページ数の表示 152 try { 153 //プリペアドステートメント作成 154 $stmt = $db->prepare("SELECT COUNT(*) FROM bbs1"); 155 //クエリ 156 $stmt->execute(); 157 } catch (PDOException $e){ 158 echo "エラー:" . $e->getMessage(). "\n" . $e->getTraceAsString(); 159 } 160 161 //コメントの件数を取得 162 $comments = $stmt->fetchColumn(); 163 //ページ数を計算 164 $max_page = ceil($comments / $num); 165 echo '<p>'; 166 for ($i = 1; $i <= $max_page; $i++){ 167 echo '<a href="fot.php?page=' . $i . '">' . $i . 168 '</a>&nbsp;'; 169 } 170 echo '</p>'; 171?> 172 </span> 173 174 175 <p class="name1">この料理へのコメントはこちらから!!</p> 176 177<span class="form"> 178 <form action="write1.php" method="post"> 179 <p>名前:<input type="text" name="name"></p> 180 <p>タイトル:<input type="text" name="title"></p> 181 <textarea name="body"></textarea> 182 <p><input type="submit" value="書き込む">&nbsp;&nbsp;<input type="reset" value="リセット"></p> 183 </form> 184 </span><!-- form --> 185 </div><!-- nav-content終了 --> 186 </div><!-- ハンバーガー --> 187 188

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

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

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

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

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

guest

回答2

0

エミュレーションをoffにしているため、
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

ネイティブなmysqlでは bind by name でのパラメータ受け渡しは構文として存在しないため、
構文エラーになります。

bind by name を使いたいのであれば
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
にすればいいのですが、別の弊害が発生する可能性があるので、SQLを ? を使用した
パラメータクエリに変更する方がいいです。

php

1/* ここをパラメータクエリに修正する 2 $stmt = $db->prepare(" 3 INSERT INTO bbs1 (name1, title1, body1, date1 ) 4 VALUES (:name1, :title1, :body1, now() )" 5 ); 6 7 //パラメータを割り当て 8 $stmt->bindParam(':name1', $name1, PDO::PARAM_STR); 9 $stmt->bindParam(':title1', $title1, PDO::PARAM_STR); 10 $stmt->bindParam(':body1', $body1, PDO::PARAM_STR); 11*/ 12 $stmt = $db->prepare(" 13 INSERT INTO bbs1 (name1, title1, body1, date1 ) 14 VALUES (?, ?, ?, now() )" 15 ); 16 17 //パラメータを割り当て 18 $stmt->bindParam(1, $name1, PDO::PARAM_STR); 19 $stmt->bindParam(2, $title1, PDO::PARAM_STR); 20 $stmt->bindParam(3, $body1, PDO::PARAM_STR);

ついでに、エラー内容が分かりにくいので、

php

1} catch(PDOException $e) { 2 die ('エラー:' . $e->getMessage() . "\n" . $e->getTraceAsString()); 3}

上記に修正すれば、エラー行が特定できてデバッグしやすくなるでしょう。

投稿2018/10/14 12:02

編集2018/10/14 12:47
kaba

総合スコア314

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

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

torinoto7

2018/10/14 12:38

回答頂き有り難うございます。 SQLでパラメータクエリに変更(name1→name)に変更を行いましたが、 エラーは変わらずのままでした。
退会済みユーザー

退会済みユーザー

2018/10/14 15:30

PDO::ATTR_EMULATE_PREPARES => falseとしても、名前付きプレースホルダの処理は PDO レベルでよしなにやってくれるはずです。 あと、PDO::ATTR_ERRMODE が適切に設定されないと、catch にまともなメッセージも入らないはずです。
torinoto7

2018/10/14 21:27

回答修正・コメント頂き有り難うございます。 ソースの追加・変更等行ってみた所、 一回目と同じエラーとなってしまいました。 質問のソースコードを回答欄で言われていた所を修正しましたので拝見頂きたく。 宜しくお願いします。
退会済みユーザー

退会済みユーザー

2018/10/14 23:08

修正して実行しててことよ。
kaba

2018/10/15 03:28

エラーメッセージは相変わらず エラー:Array ([0] => 00000[1] =>[2] => ) のままってことですか?
torinoto7

2018/10/15 11:34

エラーメッセージは変わらず以下のエラーでした。 Array([0]=>00000[1]=>[2]=>)
kaba

2018/10/15 12:20 編集

行番号が出ないということは、fot.htmlの echo "エラー:" . $e->getMessage(); を通過しているということですね。 ただ、その部分の try catch の間ではエラーになりそうなコードは見受けられないのですが、 念のためこちらも echo "エラー:" . $e->getMessage(). "\n" . $e->getTraceAsString(); に修正して、エラー行を特定するとデバッグしやすくなります。
torinoto7

2018/10/15 12:57

回答有り難うございます。 上記のエラーコードも追記してみたのですが、状況変わりませんでした。 同一ページ内に複数のPHPを記載しているのが宜しくないのでしょうか? 一つ目の簡易掲示板はエラーもなく動作もしているのですが...。
kaba

2018/10/15 13:03

別のデバッグ方法として、 error_log(__FILE__ . '(' . __LINE__ . ')'); をあちこちに埋め込んで、エラー行を特定するという方法もあります。 エラーが発生したら、エラーログの最後の行付近にエラーが発生する直前のファイルパスと行番号が出力されます。
torinoto7

2018/10/15 22:13

「print_r($db->errorInfo());」が入力されていた事によるエラーでした。 色々と教えて下さり、有り難うございました。
guest

0

試してないですけど、PDO::ATTR_ERRMODEの設定が入っていないため、中途半端なエラーメッセージになっているのではないかと思います。
まずは、PDO::ATTR_ERRMODEの設定を行い、正しく、try-chatch を動作させてください。

なんとなくですけど、パラメータが正しく渡っていないように思います。
デバッグしてみて、変数を追いかけてみると良いです。

投稿2018/10/14 11:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問