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

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

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

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

PHP

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

Q&A

解決済

4回答

1387閲覧

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

rude_rockers

総合スコア32

MySQL

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

PHP

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

0グッド

1クリップ

投稿2018/12/16 23:43

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

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

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

php

1<?php 2require_once('functions.php'); 3require_once('config.php'); 4ini_set('display_errors', TRUE); 5error_reporting(E_ALL); 6var_dump($_POST); 7 8$user_name = $_POST['user_name']; 9$recipe_name = $_POST['recipe_name']; 10$howto = $_POST['howto']; 11$category = (int) $_POST['category']; 12$difficulty = (int) $_POST['difficulty']; 13$budget = (int) $_POST['budget']; 14 15try{ 16 if(empty($_POST['id'])) throw new Exception('ID不正'); 17 $id = (int) $_POST['id']; 18 19 $dbh = new PDO( 20 DB_DSN, 21 DB_USER, 22 DB_PASS, 23 [ 24 PDO::ATTR_EMULATE_PREPARES, false, 25 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 26 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 27 ] 28 ); 29 30 $sql = "update recipes set user_name = ?, recipe_name = ?, category = ?, difficulty = ?, budget = ?, howto = ?, where id = ?"; 31 $stmt = $dbh->prepare($sql); 32 $stmt->bindValue(1, $user_name, PDO::PARAM_STR); 33 $stmt->bindValue(2, $recipe_name, PDO::PARAM_STR); 34 $stmt->bindValue(3, $category, PDO::PARAM_INT); 35 $stmt->bindValue(4, $difficulty, PDO::PARAM_INT); 36 $stmt->bindValue(5, $budget, PDO::PARAM_INT); 37 $stmt->bindValue(6, $howto, PDO::PARAM_STR); 38 $stmt->bindValue(7, $id, PDO::PARAM_INT); 39 $stmt->execute(); 40// print_r($stmt->fetchAll()); 41 $dbh = null; 42 echo "レシピの編集が完了しました。"; 43 44} catch(Exception $e){ 45 echo "エラー発生: " . h($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>"; 46 die(); 47} 48// <a href="index.php">トップページに戻る</a> 49

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

error

1array(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

よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

whereの前の,が不要では。

sql

1, where id = ?

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

php

1$set = []; 2$bind = []; 3if(!is_null($_POST['user_name'])){ 4 $set[] = " user_name = ? "; 5 $bind["user_name"]["value"] = $_POST['user_name']; 6 $bind["user_name"]["type"] = PDO::PARAM_STR; 7} 8if(!is_null($_POST['category'])){ 9 $set[] = " category = ? "; 10 $bind["category"]["value"] = $_POST['category']; 11 $bind["category"]["type"] = PDO::PARAM_INT; 12} 13 14//...中略 15 16$sql = "update recipes set ".implode(",",$set)." where id = ?"; 17$stmt = $dbh->prepare($sql); 18$bind_num = 1; 19foreach($bind as $bind_name=>$bind_info){ 20 $stmt->bindValue($bind_num, $bind_info["value"], $bind_info["type"]); 21 $bind_num++; 22} 23$stmt->execute();

投稿2018/12/17 00:11

編集2018/12/17 00:12
m.ts10806

総合スコア80850

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

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

rude_rockers

2018/12/17 01:21

ありがとうございます!全てが解決いたしました!!毎度お恥ずかしい。脳がエラーになっておりますw 教えていただいた書き方もやってみようと思います。
m.ts10806

2018/12/17 01:27

いかに短いやり方もで最大の効果を出すかというのはもの作りの永遠のテーマだと思いますが、配列もうまく使えばスリムなコードを書くのに役立ちます。 単にデータをループするだけが配列の脳ではないので今回のやり方も発想のひとつとして自身に取り込んでみてください。 (selectの動的なwhere句を作るときにも同じような考え方が使えます)
rude_rockers

2018/12/17 01:35

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

2018/12/17 01:37

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

2018/12/17 02:17

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

0

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

PDO::ATTR_EMULATE_PREPARES, false,

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

PDO::ATTR_EMULATE_PREPARES => false,

投稿2018/12/17 00:08

ockeghem

総合スコア11701

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

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

rude_rockers

2018/12/17 01:22

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

2018/12/17 01:37

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

0

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

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

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

投稿2018/12/17 00:04

aikon_marimo

総合スコア1083

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

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

rude_rockers

2018/12/17 01:23

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

0

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

投稿2018/12/17 00:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

rude_rockers

2018/12/17 01:27

ありがとうございます! 。。。本当ですね。 さっきも翻訳したはずなのに、whereのカンマに気づけませんでした。。。 しかも、データに「うんこ」なんて幼稚なワードでテストしてたのを公開しているなんて、思いもしませんでした・・・・・!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問