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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

6回答

1907閲覧

【MySQL】INSERT文でのシンタックスエラーを解決したい

hassan_x

総合スコア17

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

2クリップ

投稿2017/09/24 16:17

PHP(Version7.1)で以下のコードを実施したとき

<?php function addPictOverViewTable(PDO $db, String $picture_id, $title, $category){ try { $sql = "INSERT INTO picts_overview (picture_id, title, category, pins_count, register_datetime, update_datetime) VALUES (:picture_id, :title, :category, :pins_count, :register_datetime, :update_datetime)"; $stmt = $db -> prepare($sql); $stmt -> bindParam(':picture_id', $picture_id, PDO::PARAM_STR); $stmt -> bindParam(':title', $title, PDO::PARAM_STR); $stmt -> bindParam(':category', $category, PDO::PARAM_STR); $stmt -> bindValue(':pins_count', 0, PDO::PARAM_INT); $datetime = new DateTime(); $stmt -> bindValue(':register_datetime', $datetime->format('Y-m-d H:i:s'), PDO::PARAM_STR); $stmt -> bindValue(':update_datetime', $datetime->format('Y-m-d H:i:s'), PDO::PARAM_STR); } catch(PDOException $e) { echo $e->getMessage();//Remove or change message in production code } }

以下のエラーが発生します。

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 ')' at line 7

どうやらINSERT文が間違っているエラーのようですが、一向に原因が分からず、困り果てております。
予約語の可能性や、スキーマとの不一致なども確認してみましたが、正しそうでした。

少しでも何かヒントになる情報を頂ければ、大変有り難く思います。
宜しくお願い致します。

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

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

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

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

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

MasahikoHirata

2017/09/24 17:03

ざっくり見ると”INSERT INTO picts_overview (”の”(”が閉じてないのでは?。生成したSQLを先ず表示して確認されたし。
hassan_x

2017/09/24 22:39

ご回答ありがとうございます。今一度確認しましたところ、閉じられていました。もしくは自分の見方誤りでしょうか?
guest

回答6

0

executeメソッドを呼んでないのは、単に引用を省略したからでしょうか?
execute前であれば手元の環境でも試せるなと思い試したところ、特にエラーなく終了しました。executeしてないので、MySQLまで行っていないので当然ですが、そうすると、示していただいているエラーは、引用されている箇所ではないところで発生していることになります。
もう少し広い範囲を引用して頂いたほうがよいかと思います。

投稿2017/09/24 21:58

ockeghem

総合スコア11701

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

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

0

よくソースを見ずに回答していました。間違いです。すみません。
下記の定義のテーブルでは実行できました。

create table picts_overview (picture_id text, title text, category text, pins_count int, register_datetime timestamp, update_datetime timestamp);

addPictOverViewTable(PDO $db, String $picture_id, $title, $category){

このなかに「$pins_count」がふくまれておらず、値がNULLなのでエラーになっているのでは、無いでしょうか?

==>picture_idにはコンスタント0値がセットされていました。

投稿2017/09/24 22:31

編集2017/09/25 03:51
A.Ichi

総合スコア4070

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

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

King_of_Flies

2017/09/25 00:59

$stmt -> bindValue(':pins_count', 0, PDO::PARAM_INT); この記述であっても、pins_countに0が入らないということでしょうか? 詳しく教えてください。
A.Ichi

2017/09/25 01:09

すみません気が付きませんでした。その通りです。大丈夫です。
guest

0

自己解決

多数のご回答とアドバイスありがとうございました。
遅ればせながらお礼申し上げます。

お恥ずかしいですが、別の部分のファンクションでエラーになっていました。
ockeghem様の言うとおりでした。

ありがとうございました。

投稿2017/10/08 19:31

hassan_x

総合スコア17

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

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

0

DoctrineのDBALを使うと簡単にデータベースの操作ができます。

valuesに数字を振ってあるのはsetParameterの第1引数に渡す数値を間違えないようにするためにしています。

php

1 2use Doctrine\DBAL\Configuration; 3use Doctrine\DBAL\DriverManager; 4 5$config = new Configuration(); 6 7$dbParams = array( 8 'driver' => 'pdo_mysql', 9 'host' => 'localhost', 10 'user' => 'root', 11 'password' => '', 12 'dbname' => 'dbname' 13); 14 15$conn = DriverManager::getConnection($dbParams, $config); 16$builder = $conn->createQueryBuilder(); 17 18$bulder->insert('picts_overview') 19 ->values(array( 20 'picture_id' => '?', // 0 21 'title' => '?',   // 1 22 'category' => '?',  // 2 23 'pins_count' => '?',     // 3 24 'register_datetime' => '?', // 4 25 'update_datetime' => '?',  // 5 26 )) 27 ->setParameter(0, $picture_id) 28 ->setParameter(1, $title) 29 ->setParameter(2, $category) 30 ->setParameter(3, 0) 31 ->setParameter(4, "NOW()") 32 ->setParameter(5, "NOW()") 33 ->execute();

投稿2017/09/26 05:46

naohiro19_

総合スコア178

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

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

0

一応同じ名称をつかって試してみましたが特に問題はなさそうです
violation: 1064 はカラム名などを間違えるとよくでるエラーなので
タイプミスなどよくよく見直してみて下さい

ちなみにいくつか気になる点があります。

  • bindValue()で数値をダイレクトにいれたり、日付をPHPでフォーマットしていれたりしていますが

無駄だと思います。

PHP

1 $sql = "INSERT INTO `picts_overview`" 2 $sql.= "(picture_id, title, category, pins_count, register_datetime, update_datetime)"; 3 $sql.= " VALUES (:picture_id, :title, :category, 0, NOW(), NOW())";
  • id(picture_id)に文字列系のデータをつかっていますが、

idは可能な限りint系のデータにしておいたほうが無難です。

  • bindParamもユーザー関数の引数を引き継ぐならbindValueで十分かと

投稿2017/09/25 01:42

yambejp

総合スコア114829

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

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

0

$datetime_regist = new DateTime();
$stmt -> bindValue(':register_datetime', $datetime_regist->format('Y-m-d H:i:s'), PDO::PARAM_STR);
$datetime_update = new DateTime();
$stmt -> bindValue(':update_datetime', $datetime_update->format('Y-m-d H:i:s'), PDO::PARAM_STR);

これくらいしか思いつかないんですが、試してみていただけますか。

追記ー
やっぱりこれをしたところで変数に格納する値は変わらないので、
意味がないと思いました。

見なかったことにしてください。

投稿2017/09/25 01:09

編集2017/09/25 01:15
King_of_Flies

総合スコア382

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問