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

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

ただいまの
回答率

91.36%

  • PHP

    15195questions

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

  • データベース

    542questions

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

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

受付中

回答 4

投稿 2017/11/24 11:22 ・編集 2017/11/27 13:17

  • 評価
  • クリップ 0
  • VIEW 139

Tsukumo_Aoi

score 7

在庫を管理するシステムにおいて、商品コード、商品名、値段、在庫数を入力してデータベースを更新するシステムを構築しているのですが、下記の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
  session_start();

  function connect() {
    return new PDO("mysql:dbname=roujin", "root");
  }

?>


syouhinzaiko.php

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta http-equiv="Content-Style-Type" content="text/css">
  <meta http-equiv="Content-Script-Type" content="text/javascript">
  <title>商品在庫管理画面</title>
<style type="text/css">

<!--
FORM {
  margin: 0px;
}
-->
</style>

<script>
<!--
function refresh() {
    window.location.reload();
}
// -->
</script>

<script>

function goServletB(){
document.getElementById('form').action = 'add.php';
}
function goServletC(){
document.getElementById('form').action = 'derete.php';
}
</Script>

</head>


<body>

  <div align="center">
  <font color="#00008b"><strong><font size="+1">商品在庫管理画面</font></strong></font>
  <hr width="300">
  <small><font color="#ff0000"></font></small>

 <div align="center">
   <form id='form' name='form' action="koushin.php" method = "POST">
   <table width="860" border="0" cellspacing="0" cellpadding="2" summary="商品の追加・更新・削除">
   <tbody>
     <tr>
      <td>
      <small><font color="#ff0000">★&nbsp;商品コードの変更はできません。</font><br>
     &nbsp;商品コードを変更する場合は、新しい商品コードで商品を追加し、古い商品コードの商品は削除してください。</small></td></tr>
    <tr>
      <td>
      <table width="100%" border="1" cellspacing="0" cellpadding="2" summary="商品情報入力欄">
      <tbody><tr><td>商品コード(必須)<br><small>※半角英数字でお願いします。</small></td>
      <td align="center" valign="middle">商品名(任意)</td><td align="center" valign="middle">価格(任意)<br>
      <small>※カンマは入れずに半角数字でご記入ください。</small></td>
      <td align="center" valign="middle">在庫数(必須)<br>
      <small>※カンマは入れずに半角数字でご記入ください。</small></td>
    </tr>

   <tr>
    <td align="center"><input name="shohin_id" type="text" size="18" maxlength="200" value=""></td>
    <td align="center" valign="middle"><input name="name" type="text" size="35" maxlength="200" value=""></td>
    <td align="center" valign="middle"><input name="price" type="text" size="15" maxlength="20" value=""></td>
    <td align="center" valign="middle"><input name="zaiko" type="text" size="8" maxlength="20" value=""></td>
    </tr></tbody></table>
    </td>
   </tr>

  <tr>
   <td>
     <input type="submit" value="更新" >
     <input type="submit" value="追加" onclick="goServletB();">
     <input type="submit" value="削除" onclick="goServletC();">
     <input type="reset" value="取消">
   </td>
  </tr>
  </tbody></table>
</form>
</div>

<hr>

<div align="center">
<table width="860" border="0" cellspacing="0" cellpadding="0" summary="商品在庫一覧">
<caption align="top"><font color="#00008b"><strong>商品在庫一覧</strong></font></caption>
  <tbody><tr><td align="center"><table width="860" border="1" cellspacing="0" cellpadding="1" summary="ヘッダー">
  <tbody><tr><td width="120" align="center"><small>商品コード<br>
※半角英数字</small></td>
<td width="280" align="center" valign="middle"><small>商品名</small></td>
<td width="110" align="center" valign="middle"><small>価格</small></td>
<td width="82" align="center" valign="middle"><small>在庫数</small></td>
<td width="110" align="center" nowrap=""><small>削除ボタン</small></td>
  </tr>
</tbody></table>


<table>
  <tbody><tr><td align="center"><table width="860" border="1" cellspacing="0" cellpadding="1" summary="ヘッダー">
  <tr><td width="120" align="center">
  <?php foreach ($goods as $g) { ?>
   <tbody><tr>
     <td width="120" align="center"><small>
       <p><?php echo $g['shohin_id'] ?></p></small>
     </td>
     <td width="280" align="center" valign="middle"><small>
       <p><?php echo $g['name'] ?></p></small></td>
     <td width="110" align="center" valign="middle"><small>
       <br><p><?php echo $g['price'] ?> 円</p><br>
     </small></td>
     <td width="82" align="center" valign="middle"><small>
      <p>在庫: <?php echo $g['zaiko'] ?> 個</p>
     </small></td>
     <td width="110" align="center" nowrap=""><input type="button" action="derete" value="削除"><small>
     </small></input></td>
   </tr>
   <?php } ?>
</tbody></table>




</body></html>

koushin.php

<html>
<body>

<?php
  require 'zaiko_common.php';

$shohin_id = $_POST['shohin_id'];
$name = $_POST['name'];
$price = $_POST['price'];
$zaiko = $_POST['zaiko'];

$pdo = connect();
$st = $pdo->query("SELECT name, price, zaiko FROM shohin_tb WHERE shohin_id = '$shohin_id'");
$muni = $st->fetchAll();

  if (!isset ($name)) {
    $name = $muni['name'];
  }
  if (!isset ($price)) {
    $price = $muni['price'];
  }
  if (!isset ($zaiko)) {
    $zaiko = $muni['zaiko'];
  }

  try{
  $dsn = 'mysql:host=localhost; dbname=roujin; charset=utf8';
  $user = 'root';
  $pdo = new PDO($dsn, $user);
  $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="UPDATE shohin_tb SET (shohin_id,name,price,zaiko)values(:shohin_id,:name,:price,:zaiko)";

  $stmt = $pdo->prepare($sql);
  $stmt->bindValue(':shohin_id',$shohin_id);
  $stmt->bindValue(':name',$name);
  $stmt->bindValue(':price',$price);
  $stmt->bindValue(':zaiko',$zaiko);
  $stmt->execute();

  $rows=$stmt->fetchAll(PDO::FETCH_ASSOC);
  print_r($rows);
  }catch(PDOException $e){
  die($e->getMessage());
  }

// 更新完了のメッセージ
  echo '更新完了しました';
?>
<a href="zaiko_connect.php">商品在庫管理画面へ</a>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2017/11/24 11:50

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

    キャンセル

  • Tsukumo_Aoi

    2017/11/24 11:53

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

    キャンセル

回答 4

+1

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

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

投稿 2017/11/24 11:32

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/24 11:45

    SELECT文を直し忘れてました。
    変更しましたが改善しません。

    キャンセル

  • 2017/11/24 11:54

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

    キャンセル

  • 2017/11/24 12:03

    わかりました!

    キャンセル

+1

まず

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

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

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

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

$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 11:35

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/24 11:50

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

    キャンセル

  • 2017/11/24 12: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());
    }

    キャンセル

  • 2017/11/24 13:15

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

    キャンセル

+1

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

投稿 2017/11/24 12:09

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/24 13:14

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

    キャンセル

0

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


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

投稿 2017/11/24 11:34

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/24 11:44

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

    キャンセル

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

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • PHP

    15195questions

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

  • データベース

    542questions

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