XAMPPでPHPのコードを書いているがSQLに書き込みができない
解決したいこと
「気づけばプロ並みPHP改訂版」という本でショッピングサイトを作成しています。
XAMPPを使用してまずはSQLと連携して商品リストの追加のページを作成しています。
try catch文でDBに本題がある時は「ただいま障害により大変ご迷惑をお掛けしております。」とメッセージが表示されるようにしているのですがそのメッセージしか出ずSQLに書き込みができていないようです。
正常にDBに書き込みが反映されてExceptionのメッセージが表示されないようにしたいです。
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のソースコード
<!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」のカラムは後で使用するけど最初にテーブルに追加しておくようにと本では指示がありました。
以下はアドミンの画像(テーブルやコラム名も間違ってはいないと思います)
またWordPressなどはまだ使用していないのですがこちらの記事と同じ原因の可能性がありますでしょうか?
今の私には理解できなかったので試してはいないですが「.htaccess」が500エラーを出すと記載があったので気になりました。
https://oxynotes.com/?p=1982
.htaccessの確認(同ディレクトリの存在しないファイルにアクセスして【404 Not Found】が出たのを確認)は行っております。
DBの起動の確認もしました。
追記:自己解決しました。
以下の記事を参考にしました。
https://qiita.com/seltzer/items/3096f0805440bfa19bff