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

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

ただいまの
回答率

90.37%

  • PHP

    25087questions

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

  • MySQL

    7306questions

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

mysql5.7でのプリペアドステートメント構文のエラー

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 304

rude_rockers

score 25

料理レシピアプリを構築中、エラーに悩まされ詰まっております。

こちらのコードで次のエラーが出ます。
何度見直してもどこが悪いのかわかりません。

構文が悪いと出てますが、どこが悪いかご指摘くださいませんでしょうか?

<?php
require_once('functions.php');
require_once('config.php');
ini_set('display_errors', TRUE);
error_reporting(E_ALL);
var_dump($_POST);

$user_name = $_POST['user_name'];
$recipe_name = $_POST['recipe_name'];
$howto = $_POST['howto'];
$category = (int) $_POST['category'];
$difficulty = (int) $_POST['difficulty'];
$budget = (int) $_POST['budget'];

try{
  if(empty($_POST['id'])) throw new Exception('ID不正');
  $id = (int) $_POST['id'];

  $dbh = new PDO(
      DB_DSN,
      DB_USER,
      DB_PASS,
      [
          PDO::ATTR_EMULATE_PREPARES, false,
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
      ]
  );

  $sql = "update recipes set user_name = ?, recipe_name = ?, category = ?, difficulty = ?, budget = ?, howto = ?, where id = ?";
  $stmt = $dbh->prepare($sql);
  $stmt->bindValue(1, $user_name, PDO::PARAM_STR);
  $stmt->bindValue(2, $recipe_name, PDO::PARAM_STR);
  $stmt->bindValue(3, $category, PDO::PARAM_INT);
  $stmt->bindValue(4, $difficulty, PDO::PARAM_INT);
  $stmt->bindValue(5, $budget, PDO::PARAM_INT);
  $stmt->bindValue(6, $howto, PDO::PARAM_STR);
  $stmt->bindValue(7, $id, PDO::PARAM_INT);
  $stmt->execute();
// print_r($stmt->fetchAll());
  $dbh = null;
  echo "レシピの編集が完了しました。";

} catch(Exception $e){
  echo "エラー発生: " . h($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>";
  die();
}
// <a href="index.php">トップページに戻る</a>

エラーと「var_dump($_POST);」の結果。

array(7) { ["user_name"]=> string(7) "paise33" ["recipe_name"]=> string(9) "うんこ" ["category"]=> string(1) "1" ["difficulty"]=> string(1) "1" ["budget"]=> string(3) "334" ["howto"]=> string(13) "tttyyyy mmmm" ["id"]=> string(2) "19" } エラー発生: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where id = 19' at line 1

よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+3

whereの前の,が不要では。

, where id = ?

setとbindValueのところを手書きするのではなく配列に詰め込んでimplodeするとかのほうがコード量も少なくなりますし確実性が増します。

$set = [];
$bind = [];
if(!is_null($_POST['user_name'])){
  $set[] = " user_name = ? ";
  $bind["user_name"]["value"] = $_POST['user_name'];
  $bind["user_name"]["type"] = PDO::PARAM_STR;
}
if(!is_null($_POST['category'])){
  $set[] = " category = ? ";
  $bind["category"]["value"] = $_POST['category'];
  $bind["category"]["type"] = PDO::PARAM_INT;
}

//...中略

$sql = "update recipes set ".implode(",",$set)." where id = ?";
$stmt = $dbh->prepare($sql);
$bind_num = 1;
foreach($bind as $bind_name=>$bind_info){
 $stmt->bindValue($bind_num, $bind_info["value"], $bind_info["type"]);
 $bind_num++;
}
$stmt->execute();

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/17 10:35

    脳が溶けそうですが、なんとか進みます。

    キャンセル

  • 2018/12/17 10:37

    厳しいこと言うと
    そういうわけのわからない例えを出してる暇があったらミニマムコードのひとつでも書いて動かしてエラーで一喜一憂したほうが良いです。
    書かないコードは動かないしエラーを乗り越えないと成長もしません。
    失敗したぶんだけ成長するのはスポーツと同じと考えます

    キャンセル

  • 2018/12/17 11:17

    す、すいません・・・
    書くことの大切さを痛感しています。

    キャンセル

+3

update文のwhereの前にカンマがありますが、不要です。

  $sql = "update ~略~ howto = ?, where id = ?";


より詳細の調査になれば、テーブル構造も提示願います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/17 10:23

    ありがとうございます!!解決できましたm(_ _)m

    キャンセル

+3

直接の原因は既に指摘のあるとおりですが、以下もおかしいですね。

PDO::ATTR_EMULATE_PREPARES, false,

正しくは以下かと思います。

PDO::ATTR_EMULATE_PREPARES => false,

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/17 10:22

    あ、ありがとうございます!!
    調べ直してみます!!

    キャンセル

  • 2018/12/17 10:37

    本当だ!!ありがとうございます!!
    コピペした部分がバレてしまいましたww

    キャンセル

+2

よんでエラーの通り、
その文脈だとwhere句を置く場所ではなくなっているから 
その構文付近を見直してみましょう

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/17 10:27

    ありがとうございます!
    。。。本当ですね。
    さっきも翻訳したはずなのに、whereのカンマに気づけませんでした。。。


    しかも、データに「うんこ」なんて幼稚なワードでテストしてたのを公開しているなんて、思いもしませんでした・・・・・!!!

    キャンセル

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

  • ただいまの回答率 90.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • PHP

    25087questions

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

  • MySQL

    7306questions

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