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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

1回答

567閲覧

PHP MySQL(UPDATE)更新処理実行の際にシンタックスエラーが発生して更新できない。

dera

総合スコア28

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2023/11/07 07:18

編集2023/11/07 08:11

実現したいこと

フォームから入力されたidが存在するときデータを更新したい

元の値

idtitlebody
1xxxzzz

更新後(フォームで入力した値)

idtitlebody
1zzzyyy

前提

入力フォームで入力したデータを送信する際にエラーが発生している。
データベースは接続できている
テーブル作成済み
更新処理のためにあらかじめデータ用意済

発生している問題・エラーメッセージ

Fatal error: Uncaught PDOException: 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 PDOException: 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

該当のソースコード

php

1<?php 2 3$db_host =xxxx 4$dsn = xxxx 5$user = xxxx 6$password = xxxx 7 8try { 9 $dbh = new PDO($dsn, $user, $password); 10} catch (PDOException $e) { 11} 12 13?> 14 15<!DOCTYPE html> 16<html> 17 18<form method="post"> 19 <p>ID:<input type="text" name="id" /></p> 20 <p>タイトル:<input type="text" name="title" /></p> 21 <p>内容:<textarea type="text" name="body" rows="3"></textarea></p> 22 <button>送信</button> 23</form> 24<h1>メッセージ</h1> 25<div name="ans" style="border: 1px solid;padding:10px"> 26 <?php 27 // PHP8から$_POSTは未定義扱いになりエラーがでるので、issetで回避する 28 if (isset($_POST['title']) || isset($_POST['body']) || isset($_POST['id'])) { 29 // 現在日時 30 $input_datetime = date("Y-m-d H:i:s"); 31 // 更新対象のID 32 $id = $_POST['id']; 33 // 更新SQL 34 $sql = "update testtable set (title = :title, body = :body, updated_at = :updated_at where id = $id)"; 35 $stmt = $dbh->prepare($sql); 36 $stmt->bindValue(':title', $_POST['title']); 37 $stmt->bindValue(':body', $_POST['body']); 38 $stmt->bindValue(':updated_at', $input_datetime); 39 40 //idが0件の場合の処理 41 $id_check = "select title, body from testtable where id = $id"; 42 $result = $dbh->query($id_check); 43 $count = $result->rowCount(); 44 if ($count == 0) { 45 echo '更新対象が見つかりません'; 46 } 47 //実行結果 48 if ($stmt->execute()) { 49 echo ' 更新完了しました'; 50 } else { 51 echo '更新に失敗しました'; 52 } 53 } 54 ?> 55</div> 56 57</html>

試したこと

SQLSTATE[42000]: Syntax error シンタックスエラー(SQL文法間違い)
とあるので、

update構文の見直し(お作法等が間違っていないか)をしたが、正しい形になっていると思うので
どこに原因があるかわからない

補足情報(FW/ツールのバージョンなど)

php8
mysql
vscode

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

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

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

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

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

yambejp

2023/11/07 07:33

「id = $id」的なところもprepareで処理してください
dera

2023/11/07 08:12 編集

//idが0件の場合の処理 $id_check = "select title, body from testtable where id = $id"; $result = $dbh->query($id_check); $count = $result->rowCount(); var_dump($count); if ($count === 0) { echo '更新対象が見つかりません'; } ここの処理ですが、prepareではなくqueryにしないとidが存在するときも カウント0で返ってきてしまうのでqueryにしています。 ダメでしょうか?
yambejp

2023/11/07 08:06

> カウント0で返ってきてしまうのでqueryにしています。 > ダメでしょうか? ダメです。検索条件など外部から値を指定するときはかならずprepareで処理してください
otn

2023/11/07 08:08

> prepareではなくqueryにしないとidが存在するときもカウント0で返ってきてしまうので それは単にコードが間違っているだけです。間違いを直せば大丈夫です。
dera

2023/11/07 08:20

なるほど。queryではなくprepareにしたときにカウント値が異なるのはコードの書き方の問題なんですね。 この2つの違いが理解できていないからだと思うので、使い方をもう少し調べてみます。
yambejp

2023/11/07 08:38

具体例で説明しますと「id=$id」として$idがnullだったとき 「id=」というクエリーになり、シンタックスエラーになります。
dera

2023/11/07 23:34

ありがとうございます。難しいですね、単純にselect文が違っているせいでとれないのかもしれないと思っているので、見直してみます。
yambejp

2023/11/08 00:12

そもそもどの行でエラーになっているかの情報もないですし、加えてエラーの提示も重要なところが省略されていて指摘のしようがないですね。
guest

回答1

0

ベストアンサー

SQL

1update testtable set (title

setの後ろにカッコをつけるのはおかしいですね

追記

PHP

1$id =filter_input(INPUT_POST,"id"); 2$title =filter_input(INPUT_POST,"title"); 3$body =filter_input(INPUT_POST,"body"); 4$sql = "update testtable set title = ?, body = ?, updated_at = now() where id = ?"; 5$stmt = $dbh->prepare($sql); 6$stmt->execute([$title,$body,$id]); 7$sql "select title, body from testtable where id = ?"; 8$stmt = $dbh->prepare($sql); 9$stmt->execute([$id]); 10$rows=$stmt->fetchAll(PDO::FETCH_ASSOC);

投稿2023/11/07 07:37

編集2023/11/08 00:18
yambejp

総合スコア117674

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

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

dera

2023/11/07 07:55

ご指摘ありがとうございます・・・。見直したとかいって見落としていました。 失礼しました。
yambejp

2023/11/08 00:19

追記分ご確認ください
dera

2023/11/08 00:59

ありがとうございます!updateのカッコでエラーがとれました。 また、select文もうまくいかずカウント値がちゃんと取れなかったのですが、追記いただいたものに変えて // PHP8から$_POSTは未定義扱いになりエラーがでるので、issetで回避する if (isset($_POST['title']) && isset($_POST['body']) && isset($_POST['id'])) { // 更新対象のidが存在するか確認 $id = filter_input(INPUT_POST, "id"); $sql = "select title, body from blog where id = ?"; $stmt = $dbh->prepare($sql); $stmt->execute([$id]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); $count = count($rows); if ($count === 0) { echo ' 更新対象が見つかりません'; return; } //更新処理 $title = filter_input(INPUT_POST, "title"); $body = filter_input(INPUT_POST, "body"); $sql = "update blog set title = ?, body = ?, updated_at = now() where id = ?"; $stmt = $dbh->prepare($sql); if ($stmt->execute([$title, $body, $id])) { echo ' 更新完了しました'; } else { echo '更新に失敗しました'; } } このような形にしたところやりたい動きになりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問