Saki0506
@Saki0506 (さき おぐら)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

XAMPPでPHPのコードを書いているがSQLに書き込みができない

解決したいこと

「気づけばプロ並みPHP改訂版」という本でショッピングサイトを作成しています。
XAMPPを使用してまずはSQLと連携して商品リストの追加のページを作成しています。
try catch文でDBに本題がある時は「ただいま障害により大変ご迷惑をお掛けしております。」とメッセージが表示されるようにしているのですがそのメッセージしか出ずSQLに書き込みができていないようです。
正常にDBに書き込みが反映されてExceptionのメッセージが表示されないようにしたいです。

やったこと
1. 下記の商品登録ページの作成
Screenshot 2021-04-11 at 23.32.47.png

1のソースコード

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ろくまる農園</title>
</head>
<body>

商品追加<br />
<br />
<form method="post" action="pro_add_check.php">
商品名を入力してください。<br />
<input type="text" name="name" style="width:200px"><br />
価格を入力してください。<br />
<input type="text" name="price" style="width:50px"><br />
<br />
<input type="button" onclick="history.back()" value="戻る">
<input type="submit" value="OK">
</form>

</body>
</html>

2.下記の登録情報確認のページ
Screenshot 2021-04-11 at 23.33.49.png

2のソースコード

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ろくまる農園</title>
</head>
<body>

<?php

$pro_name=$_POST['name'];
$pro_price=$_POST['price'];

$pro_name=htmlspecialchars($pro_name,ENT_QUOTES,'UTF-8');
$pro_price=htmlspecialchars($pro_price,ENT_QUOTES,'UTF-8');

if($pro_name=='')
{
    print '商品名が入力されていません。<br />';
}
else
{
    print '商品名:';
    print $pro_name;
    print '<br />';
}

if(preg_match('/\A[0-9]+\z/',$pro_price)==0)
{
    print '価格をきちんと入力してください。<br />';
}
else
{
    print '価格:';
    print $pro_price;
    print '円<br />';
}

if($pro_name=='' || preg_match('/\A[0-9]+\z/',$pro_price)==0)
{
    print '<form>';
    print '<input type="button" onclick="history.back()" value="戻る">';
    print '</form>';
}
else
{
    print '上記の商品を追加します。<br />';
    print '<form method="post" action="pro_add_done.php">';
    print '<input type="hidden" name="name" value="'.$pro_name.'">';
    print '<input type="hidden" name="price" value="'.$pro_price.'">';
    print '<br />';
    print '<input type="button" onclick="history.back()" value="戻る">';
    print '<input type="submit" value="OK">';
    print '</form>';
}

?>
</body>
</html>

3. 登録完了のページ(ここで「ただいま障害により大変ご迷惑をお掛けしております。」のメッセージしか出ません。try catch文でExceptionのとき(DBが停止中など)に出るメッセージなのでSQLでデータの書き込みがDBにできていないかと思います。DB自体は起動を確認済みです。)

3. 登録完了のページのソースコード

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ろくまる農園</title>
</head>
<body>

<?php

try
{

$pro_name=$_POST['name'];
$pro_price=$_POST['price'];

$pro_name=htmlspecialchars($pro_name,ENT_QUOTES,'UTF-8');
$pro_price=htmlspecialchars($pro_price,ENT_QUOTES,'UTF-8');

$dsn='mysql:dbname=shop;host=localhost;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

$sql='INSERT INTO mst_product(name,price) VALUES (?,?)';
$stmt=$dbh->prepare($sql);
$data[]=$pro_name;
$data[]=$pro_price;
$stmt->execute($data);

$dbh=null;

print $pro_name;
print 'を追加しました。<br />';

}
catch(Exception$e)
{
    print'ただいま障害により大変ご迷惑をお掛けしております。';
    exit();
}

?>

<a href="pro_list.php">戻る</a>

</body>
</html>

自分で試したこと

サンプルのコードをコピーペーストしたのでコード自体は間違っていないはずです。
テキスト本のもので私が実際に描いていないので抽象的で質問が分かりにくいかもしれませんがSQLでDBに書きこめていない理由が知りたいです。憶測でも構いませんので教えていただけると助かります。
よろしくお願いします。

追記
ini_set("display_errors", 1);
error_reporting(E_ALL);
上記のコードを追加してエラーメッセージの表示。
エラーは500番でした。

結果:Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1364 Field 'gazou' doesn't have a default value in /Applications/XAMPP/xamppfiles/htdocs/product/pro_add_done.php:30 Stack trace: #0 /Applications/XAMPP/xamppfiles/htdocs/product/pro_add_done.php(30): PDOStatement->execute(Array) #1 {main} thrown in /Applications/XAMPP/xamppfiles/htdocs/product/pro_add_done.php on line 30

pro_add_done.php on line 30とあるので以下のコードが対象になるようです。DBの書き込みに失敗しているようです。
その前のところは問題ないようなのでDBに接続はできているかと思います。

$stmt->execute($data);

「gazou」のカラムにデフォルト値がないと言っているようですが、「gazou」のカラムは後で使用するけど最初にテーブルに追加しておくようにと本では指示がありました。

以下はアドミンの画像(テーブルやコラム名も間違ってはいないと思います)
Screenshot 2021-04-12 at 10.28.29.png

またWordPressなどはまだ使用していないのですがこちらの記事と同じ原因の可能性がありますでしょうか?
今の私には理解できなかったので試してはいないですが「.htaccess」が500エラーを出すと記載があったので気になりました。
https://oxynotes.com/?p=1982

.htaccessの確認(同ディレクトリの存在しないファイルにアクセスして【404 Not Found】が出たのを確認)は行っております。
DBの起動の確認もしました。

追記:自己解決しました。
以下の記事を参考にしました。
https://qiita.com/seltzer/items/3096f0805440bfa19bff

0

1Answer

とりあえず、可能性だけで言えば

  • DBサーバが動いていない(多分ないと思いますが念のため)
  • DBサーバの接続情報が間違っている(あるかも)
  • ユーザID/パスワードが間違っている(あるかも)
  • 認証情報/認証方法がおかしい(あるかも)
  • SQLの構文がおかしい(ぱっと見は大丈夫そうですが、テーブル名・カラム名の打ち間違いなどありえるかも)
  • 呼び出し方がおかしい

などが考えられます。ほかにもあるかもしれません。

しかし情報なしでやみくもに推測するよりも、例外情報を確認してなぜエラーになっているかを調べたほうが早いと思います。

まずは $e->getMessage()$e->getTraceAsString() などを出力して、確認するとエラーの原因がわかるんじゃないかと思います。

0Like

Comments

  1. @Saki0506

    Questioner

    ご回答ありがとうございます。
    追記したのでもしよろしければ見ていただけないでしょうか?

    DBサーバが動いていない(多分ないと思いますが念のため)
    確認しました。
    DBサーバの接続情報が間違っている(あるかも)
    DBの名前やコラム名でしょうか?でしたら確認して問題ありませんでした。
    ユーザID/パスワードが間違っている(あるかも)
    初期値でrootで入っているのでPW等は設定していないので問題ないかと思います。
    認証情報/認証方法がおかしい(あるかも)
    すいませんこちらの確認ができなかったので詳しく教えていただけますか?
    SQLの構文がおかしい(ぱっと見は大丈夫そうですが、テーブル名・カラム名の打ち間違いなどありえるかも)
    打ち間違いも確認しましたが問題ないと思います。念のため、ダウンロードできるサンプルコードもコピペしてあります。
    呼び出し方がおかしい
    すいませんこちらの確認ができなかったので詳しく教えていただけますか?
  2. エラーメッセージを見ると

    General error: 1364 Field 'gazou' doesn't have a default value in (略)

    とあります。

    テーブルに gazou というカラムがあるけど、インサートのときに値を指定していないし、テーブル作成時にデフォルト値も指定しなかったので、インサートに失敗しているのだと思います。

    (画像にもあるとおり、null を許容しないカラムですよね)

    対策方法は、インサート時に gazou にデータを与える、あるいはテーブルを変更して null を許容するかデフォルト値を指定すればよいのではないかと思います。

    【追記】

    「気づけばプロ並みPHP改訂版」を見たことがないのでわかりませんが、もしインサート文も書籍とそのまま同じであれば、書籍では gazou カラムが NULL 許容になっているのではないでしょうか?
  3. @Saki0506

    Questioner

    お早い回答ありがとうございます!
    以下の記事を参考にしてconfigを編集したら動きました。本当にありがとうございました。
    また何かありましたらよろしくお願いします(>_<)
    https://qiita.com/seltzer/items/3096f0805440bfa19bff

Your answer might help someone💌