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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

4回答

3867閲覧

PHPでのデータベース更新をしたいのですが…

Tsukumo_Aoi

総合スコア21

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2017/11/24 02:22

編集2017/11/27 04:17

在庫を管理するシステムにおいて、商品コード、商品名、値段、在庫数を入力してデータベースを更新するシステムを構築しているのですが、下記のkousinn.phpにおいて『SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(shohin_id,name,price,zaiko) values (?,?,?,?)' at line 1』と表示されます。
更新については商品コードを必須項目として、商品名・値段・在庫数の内、更新が必要な項目を入力すればその項目だけ更新されるようにするシステムです。
どこがおかしいのかご教授お願い致します。

zaiko_common.php

php

1<?php 2 session_start(); 3 4 function connect() { 5 return new PDO("mysql:dbname=roujin", "root"); 6 } 7 8?> 9

syouhinzaiko.php

PHP

1<html> 2<head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 4 <meta http-equiv="Content-Style-Type" content="text/css"> 5 <meta http-equiv="Content-Script-Type" content="text/javascript"> 6 <title>商品在庫管理画面</title> 7<style type="text/css"> 8 9<!-- 10FORM { 11 margin: 0px; 12} 13--> 14</style> 15 16<script> 17<!-- 18function refresh() { 19 window.location.reload(); 20} 21// --> 22</script> 23 24<script> 25 26function goServletB(){ 27document.getElementById('form').action = 'add.php'; 28} 29function goServletC(){ 30document.getElementById('form').action = 'derete.php'; 31} 32</Script> 33 34</head> 35 36 37<body> 38 39 <div align="center"> 40 <font color="#00008b"><strong><font size="+1">商品在庫管理画面</font></strong></font> 41 <hr width="300"> 42 <small><font color="#ff0000"></font></small> 43 44 <div align="center"> 45 <form id='form' name='form' action="koushin.php" method = "POST"> 46 <table width="860" border="0" cellspacing="0" cellpadding="2" summary="商品の追加・更新・削除"> 47 <tbody> 48 <tr> 49 <td> 50 <small><font color="#ff0000">&nbsp;商品コードの変更はできません。</font><br> 51  &nbsp;商品コードを変更する場合は、新しい商品コードで商品を追加し、古い商品コードの商品は削除してください。</small></td></tr> 52 <tr> 53 <td> 54 <table width="100%" border="1" cellspacing="0" cellpadding="2" summary="商品情報入力欄"> 55 <tbody><tr><td>商品コード(必須)<br><small>※半角英数字でお願いします。</small></td> 56 <td align="center" valign="middle">商品名(任意)</td><td align="center" valign="middle">価格(任意)<br> 57 <small>※カンマは入れずに半角数字でご記入ください。</small></td> 58 <td align="center" valign="middle">在庫数(必須)<br> 59 <small>※カンマは入れずに半角数字でご記入ください。</small></td> 60 </tr> 61 62 <tr> 63 <td align="center"><input name="shohin_id" type="text" size="18" maxlength="200" value=""></td> 64 <td align="center" valign="middle"><input name="name" type="text" size="35" maxlength="200" value=""></td> 65 <td align="center" valign="middle"><input name="price" type="text" size="15" maxlength="20" value=""></td> 66 <td align="center" valign="middle"><input name="zaiko" type="text" size="8" maxlength="20" value=""></td> 67 </tr></tbody></table> 68 </td> 69 </tr> 70 71 <tr> 72 <td> 73 <input type="submit" value="更新" > 74 <input type="submit" value="追加" onclick="goServletB();"> 75 <input type="submit" value="削除" onclick="goServletC();"> 76 <input type="reset" value="取消"> 77 </td> 78 </tr> 79 </tbody></table> 80</form> 81</div> 82 83<hr> 84 85<div align="center"> 86<table width="860" border="0" cellspacing="0" cellpadding="0" summary="商品在庫一覧"> 87<caption align="top"><font color="#00008b"><strong>商品在庫一覧</strong></font></caption> 88 <tbody><tr><td align="center"><table width="860" border="1" cellspacing="0" cellpadding="1" summary="ヘッダー"> 89 <tbody><tr><td width="120" align="center"><small>商品コード<br> 90※半角英数字</small></td> 91<td width="280" align="center" valign="middle"><small>商品名</small></td> 92<td width="110" align="center" valign="middle"><small>価格</small></td> 93<td width="82" align="center" valign="middle"><small>在庫数</small></td> 94<td width="110" align="center" nowrap=""><small>削除ボタン</small></td> 95 </tr> 96</tbody></table> 97 98 99<table> 100 <tbody><tr><td align="center"><table width="860" border="1" cellspacing="0" cellpadding="1" summary="ヘッダー"> 101 <tr><td width="120" align="center"> 102 <?php foreach ($goods as $g) { ?> 103 <tbody><tr> 104 <td width="120" align="center"><small> 105 <p><?php echo $g['shohin_id'] ?></p></small> 106 </td> 107 <td width="280" align="center" valign="middle"><small> 108 <p><?php echo $g['name'] ?></p></small></td> 109 <td width="110" align="center" valign="middle"><small> 110 <br><p><?php echo $g['price'] ?></p><br> 111 </small></td> 112 <td width="82" align="center" valign="middle"><small> 113 <p>在庫: <?php echo $g['zaiko'] ?></p> 114 </small></td> 115 <td width="110" align="center" nowrap=""><input type="button" action="derete" value="削除"><small> 116 </small></input></td> 117 </tr> 118 <?php } ?> 119</tbody></table> 120 121 122 123 124</body></html> 125

koushin.php

PHP

1<html> 2<body> 3 4<?php 5 require 'zaiko_common.php'; 6 7$shohin_id = $_POST['shohin_id']; 8$name = $_POST['name']; 9$price = $_POST['price']; 10$zaiko = $_POST['zaiko']; 11 12$pdo = connect(); 13$st = $pdo->query("SELECT name, price, zaiko FROM shohin_tb WHERE shohin_id = '$shohin_id'"); 14$muni = $st->fetchAll(); 15 16 if (!isset ($name)) { 17 $name = $muni['name']; 18 } 19 if (!isset ($price)) { 20 $price = $muni['price']; 21 } 22 if (!isset ($zaiko)) { 23 $zaiko = $muni['zaiko']; 24 } 25 26 try{ 27 $dsn = 'mysql:host=localhost; dbname=roujin; charset=utf8'; 28 $user = 'root'; 29 $pdo = new PDO($dsn, $user); 30 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 31 $pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8'); 32 $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 33 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 34 $sql="UPDATE shohin_tb SET (shohin_id,name,price,zaiko)values(:shohin_id,:name,:price,:zaiko)"; 35 36 $stmt = $pdo->prepare($sql); 37 $stmt->bindValue(':shohin_id',$shohin_id); 38 $stmt->bindValue(':name',$name); 39 $stmt->bindValue(':price',$price); 40 $stmt->bindValue(':zaiko',$zaiko); 41 $stmt->execute(); 42 43 $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); 44 print_r($rows); 45 }catch(PDOException $e){ 46 die($e->getMessage()); 47 } 48 49// 更新完了のメッセージ 50 echo '更新完了しました'; 51?> 52<a href="zaiko_connect.php">商品在庫管理画面へ</a> 53</body> 54</html> 55

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/11/24 02:50

指摘を受けてソースコードを修正しているようですが、変わらずエラーメッセージは同じなのでしょうか、テストサーバーにアップロードし忘れているということはないですよね?
Tsukumo_Aoi

2017/11/24 02:53

XAMMPを使ってlocalhostで起動してますのでアップロードし忘れは無いです。エラーメッセージは依然として変わらずParse error: syntax error, unexpected '$st' (T_VARIABLE) in C:\xampp\htdocs\phptest\zaikokanri\koushin.php on line 34です。
guest

回答4

0

teratail掲載用に清書していて現物と違うことで、
どこか、全角空白とか、記号が全角とか、終端記号漏れ、終端記号忘れとかないでしょうか。
掲載してあるコードをテキストエディタ上で点検してみましたが、
それっぽいところが見つからなくて違うのかもしれませんが。

投稿2017/11/24 03:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Tsukumo_Aoi

2017/11/24 04:14

見直してみたところそれらのミスはなさそうです…
guest

0

ベストアンサー

まず

new PDO("mysql:dbname=roujin", "root");

これは一般にdsnの設定をするのですがhostやcharsetの指定がされていませんが大丈夫ですか?

PHP

1$dsn = 'mysql:host=localhost; dbname=test1;charset=utf8;';

またパスワードの指定がされていませんが本チャンではきちんと指定していますか?

PHP

1$pdo = new PDO($dsn, $user,$password);

$pdo = connect();

$st = $pdo->query("・・・");

最初は接続を$pdoで受けて、ステートメントを$stで受けています
その後

$stmt = $dbh->prepare($sql);

$dbhが湧いて出てますが、これは$pdoですよね?
受けているのも変数も$stから$stmtに変更していますが、これは意識してやっていますか?

そもそも

$st = $pdo->query("SELECT * FROM shohin_tb WHERE shohin_id = $id");

と、prepare処理をせずに変数を埋め込むのもいただけません。
ご自身で一度推敲精査してから再度質問されることをお勧めします

投稿2017/11/24 02:35

yambejp

総合スコア114767

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

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

Tsukumo_Aoi

2017/11/24 02:50

課題提出としてローカルな状況で作業しているのでdsn関連はあえて設定していません。$dbhは$pdoの間違いです。 $stから$stmtに変えたのは使うsqlが違うので意識的に変更していました。
yambejp

2017/11/24 03:17

なるほど $params = array(':name' => "$name", ':price' => "$price", ':zaiko' => "$zaiko", ':id' => "$shohin_id"); を、 $st->execute($params);で実行していますが bindValueやbindParamで処理してみてはどうでしょう? また$pdoは必ずtry~catchで処理して下さい try{ $dsn = 'mysql:host=localhost; dbname=test1;charset=utf8;'; $user = 'root'; $password = 'hogehoge'; $pdo = new PDO($dsn, $user,$password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8'); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); $sql="なんたらかんたら"; $stmt = $pdo->prepare($sql); $data=[なんたらかんたら]; $stmt->execute($data); $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); print_r($rows); }catch(PDOException $e){ die($e->getMessage()); }
Tsukumo_Aoi

2017/11/24 04:15

わかりました! やってみます!
guest

0

$stmt = $dbh->prepare($sql);

$stmt = $pdo->prepare($sql);が正しいのでは?
SELECT文の$idも見当たらないです

投稿2017/11/24 02:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Tsukumo_Aoi

2017/11/24 02:45

SELECT文を直し忘れてました。 変更しましたが改善しません。
退会済みユーザー

退会済みユーザー

2017/11/24 02:54

ユーザからPOSTされた値には何が入ってるか分からないので、そのままqueryに突っ込むのは危険です。UPDATE文と同じようにプレースホルダを用いて処理すべきです 最下部のHTML(a要素)がPHPの中に入ってしまっているのも修正してください
guest

0

$stmt = $dbh->prepare($sql);

この$dbhはどこから出てきたものでしょうか?おそらくここがエラーの原因だと思われます。

投稿2017/11/24 02:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Tsukumo_Aoi

2017/11/24 02:44

pdoに直しましたが、エラーが発生しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問