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

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

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

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

PHP

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

Q&A

解決済

3回答

2132閲覧

MySQLでデータを入力する際にsyntaxエラーが起きました

watoson

総合スコア15

MySQL

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

PHP

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

1グッド

0クリップ

投稿2019/02/14 02:25

編集2019/02/20 13:57

前提・実現したいこと

PHPでmysqlを使った掲示板を作っています。
INSERTでデータを入力するところで以下のエラーメッセージが発生しました。
二日ほどこれで止まっています。お分かりの方がおられましたらご教示ください。

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

Parse error: syntax error, unexpected T_STRING in ・・・ on line 59

該当のソースコード

<?php $named=$_POST['content']; $commented=$_POST['content2']; $deleted=$_POST['number']; $edited=$_POST['edit']; $editnumber=$_POST['content3']; $passed=$_POST['pass']; $pass2=$_POST['pass2']; $pass3=$_POST['pass3']; $timed=date('Y/n/d H:i:s'); //データベース接続 $dsn='*****'; $user='******'; $password='********'; $pdo=new PDO($dsn,$user,$password,array(PDO::ATTR_ERRMODE=> PDO::ERRMODE_WARNING)); //テーブル作成 $sql="CREATE TABLE IF NOT EXISTS mission_4_1" ."(" ."id INT auto_increment," ."name char(32)," ."comment TEXT," ."time DATETIME," ."pass INT," ."primary key(id)" .");"; $stmt=$pdo->query($sql); //テーブル作成確認 $sql1='SHOW TABLES'; $result=$pdo->query($sql1); foreach($result as $row){ echo $row[0]; echo'<br>'; } echo"<hr>"; //テーブル 中身 確認 $sql2='SHOW CREATE TABLE mission_4_1'; $result=$pdo->query($sql2); foreach($result as $row1){ echo $row1[1]; } echo"<hr>"; $sql3=$pdo->prepare("INSERT INTO mission_4_1(id,name,comment,time,pass) VALUES(:id,:name,:comment,:time,:pass)"); $sql3->bindParam(':name',$name,PDO::PARAM_STR); $sql3->bindParam(':comment',$comment,PDO::PARAM_STR); $sql3->bindValue(':time',$time,PDO::PARAM_STR); $sql3->bindValue(':pass',$pass,PDO::PARAM_INT); $name=$named; $comment=$commented; $time=$timed; $pass=$passed; 59行目 $sql3 -> execute(); if(!empty($pass3)){ $sql7="SELECT*FROM mission_4_1 WHERE id=$edited"; $stmt=$pdo->query($sql7); foreach($stmt as $row){ if($row['id']==$edited and $row['pass']==$pass3){ $id="$edited"; $name="$named"; $comment="$commented"; $sql4='update mission_4_1 set name=:name,comment=:comment where id=:id'; $stmt=$pdo->prepare($sql4); $stmt->bindParam(':name',$name,PDO::PARAM_STR); $stmt->bindParam(':comment',$comment,PDO::PARAM_STR); $stmt->bindParam(':id',$id,PDO::PARAM_INT); $stmt->execute(); } } } elseif(!empty($pass2)){ $sql8="SELECT*FROM mission_4_1 WHERE id=$deleted"; $stmt=$pdo->query($sql8); foreach($stmt as $row){ if($row['id']==$deleted){ $id="$deleted"; $sql5='delete from mission_4_1 where id=:id'; $stmt=$pdo->prepare($sql5); $stmt->bindParam(':id',$id,PDO::PARAM_INT); $stmt->execute(); } } } $sql6='SELECT*FROM mission_4_1'; $stmt=$pdo->query($sql6); $results=$stmt->fetchAll(); foreach($results as $row2){ //$rowの中にはテーブルのカラム名が入る echo $row2['id'].','; echo $row2['name'].','; echo $row2['comment'].','; echo $row2['time'].'<br>'; } ?>

試したこと

bindParamやbindValueに問題があるのだろうかと思って調べてみたのですが解決策は分かりませんでした。
調べたことはエラーで検索をかけてみる、bindValue、bindParamの使い方など基本的なことを調べました。

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

ここにより詳細な情報を記載してください。

bochan2👍を押しています

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

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

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

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

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

m.ts10806

2019/02/14 02:28

[PHP]をタグに追加してください。 また「調べてみた」内容もご提示ください。 ※回答に質問者さんが調べた内容が提示されると二度手間になりますし、調べ方が合っているかどうかの判断もできませんので
papinianus

2019/02/14 02:30

59行目ってどこですか?
m.ts10806

2019/02/14 02:30

ちなみに bindParamとbindValueを同時に起用しているのはなぜでしょうか? あと、提示のコードだけでは当該エラーは出ないように思います。 現象が再現するコードをご提示ください(大体どこかで全角使ったとかコード内に何かしらコードで使えない文字列を紛れ込ませたとか、ですけど)
m.ts10806

2019/02/14 02:34

ちなみにこのエラーだとbindParamもbindValueも関係ないですね。構文エラーなので。 エラーメッセージそのまま(T_STRING まで)で検索するとおおよそ見えてくることもあるかと思います。
m.ts10806

2019/02/14 02:55

コード提示は良いのですが、コードに関係ない文言は入れないでください。正しく再現確認できません。 ※どうしても補足を入れたければプログラミング言語に則したコメント文として入れてください。
m.ts10806

2019/02/14 02:57

あと、ユーザーID,パスワードそのままかいてますけど大丈夫ですか? 編集しても履歴残るのでマズイのでしたら削除依頼出された方が良いです。
m.ts10806

2019/02/14 02:59

「59行目」という文言なしにしても当該エラーでないですね。
guest

回答3

0

手前のコード見てないんであれですが、
$name=$named;
$comment=$commented;
$time=$timed;
$pass=$passed;

これSQL構文の手前じゃないですか?

投稿2019/02/14 02:39

KoheiOkazaki

総合スコア43

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

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

watoson

2019/02/14 03:38

おっしゃる通りです。他の方からもご指摘いただきました。回答ありがとうございます。勉強になりました。
guest

0

bindParamまたはbindValueで:idが指定されていないのでは?
なおbindValueは先に変数に代入しないと意味がないです

投稿2019/02/14 02:37

yambejp

総合スコア114779

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

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

watoson

2019/02/14 03:37

回答ありがとうございます。勉強になりました。解決いたしましたので次があればまたよろしくお願いします。
guest

0

ベストアンサー

直接の回答じゃないですけど、下記のような記事を読まれて1つ1つ試した方が2日もかからなくて済んだのかなと。

ちなみに本日、同じエラーで質問投稿された方もいました。

原因は全く一緒ではないにしろ、原因の探し方は同じだと思います。


コメントしたとおり、提示コードでは同エラーは起きません。
ただ、インデントがかなり荒れていて読みづらいので、整理したうえで、気になるところをコメントしてみました。

php

1<?php 2$named=$_POST['content']; 3$commented=$_POST['content2']; 4$deleted=$_POST['number']; 5$edited=$_POST['edit']; 6$editnumber=$_POST['content3']; //mts10806 取得してるけどどこにも使ってない 7$passed=$_POST['pass']; 8$pass2=$_POST['pass2']; 9$pass3=$_POST['pass3']; 10$timed = date('Y/n/d H:i:s'); 11// データベース接続 12$dsn = 'mysql:dbname=test;host=localhost'; 13$user = 'root'; 14$password = ''; 15$pdo = new PDO($dsn, $user, $password, array( 16 PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING 17)); 18 19//mts10806 DBに関する処理を行うときはきちんとtry-catchしてException(今回はPDOException)を捕捉するようにしましょう 20 21// テーブル作成 22$sql = "CREATE TABLE IF NOT EXISTS mission_4_1" . "(" . "id INT auto_increment," . "name char(32)," . "comment TEXT," . "time DATETIME," . "pass INT," . "primary key(id)" . ");"; 23$stmt = $pdo->query($sql); 24 25// テーブル作成確認 26$sql1 = 'SHOW TABLES'; 27$result = $pdo->query($sql1); 28foreach ($result as $row) { 29 echo $row[0]; 30 echo '<br>'; 31} 32echo "<hr>"; 33 34// テーブル 中身 確認 35$sql2 = 'SHOW CREATE TABLE mission_4_1'; 36$result = $pdo->query($sql2); 37foreach ($result as $row1) { 38 echo $row1[1]; 39} 40echo "<hr>"; 41 42//mts10806 変数名や関数名にマジックナンバーは厳禁。何を保管しているものか、何をするものかわからない。prepareの返りはstatementなのでsqlという変数名もナンセンスです。 43 44$sql3 = $pdo->prepare("INSERT INTO mission_4_1(id,name,comment,time,pass) VALUES(:id,:name,:comment,:time,:pass)"); 45//mts10806 auto_increment設定しているならinsertにidは基本不要 46$sql3->bindParam(':name', $name, PDO::PARAM_STR); 47$sql3->bindParam(':comment', $comment, PDO::PARAM_STR); 48$sql3->bindValue(':time', $time, PDO::PARAM_STR); 49$sql3->bindValue(':pass', $pass, PDO::PARAM_INT); 50//mts10806 どっちかに統一を。bindValueの方がのぞましい。 51 52$name = $named; //mts10806 ここで定義してもbindParam,BindValueで使うことにはならない 53$comment = $commented; 54$time = $timed; 55$pass = $passed; 56 57$sql3->execute(); //mts10806 SQLで用意したパラメータとセットしたパラメータの数があわないのでエラーでますよ。 58 59if (! empty($pass3)) { 60 $sql7 = "SELECT*FROM mission_4_1 WHERE id=$edited"; 61 $stmt = $pdo->query($sql7); 62 foreach ($stmt as $row) { 63 if ($row['id'] == $edited and $row['pass'] == $pass3) { 64 65 $id = "$edited"; 66 $name = "$named"; 67 $comment = "$commented"; 68 $sql4 = 'update mission_4_1 set name=:name,comment=:comment where id=:id'; 69 $stmt = $pdo->prepare($sql4); 70 $stmt->bindParam(':name', $name, PDO::PARAM_STR); 71 $stmt->bindParam(':comment', $comment, PDO::PARAM_STR); 72 $stmt->bindParam(':id', $id, PDO::PARAM_INT); 73 $stmt->execute(); 74 } 75 } 76} elseif (! empty($pass2)) { 77//mts10806 なんでこの前までbindしてきてるのになぜここでやらない・・ 78 $sql8 = "SELECT*FROM mission_4_1 WHERE id=$deleted"; 79 $stmt = $pdo->query($sql8); 80 foreach ($stmt as $row) { 81 if ($row['id'] == $deleted) { 82 83 $id = "$deleted"; 84 $sql5 = 'delete from mission_4_1 where id=:id'; 85 $stmt = $pdo->prepare($sql5); 86 $stmt->bindParam(':id', $id, PDO::PARAM_INT); 87 $stmt->execute(); 88 } 89 } 90} 91 92$sql6 = 'SELECT*FROM mission_4_1'; 93$stmt = $pdo->query($sql6); 94$results = $stmt->fetchAll(); 95foreach ($results as $row2) { 96 // $rowの中にはテーブルのカラム名が入る 97 echo $row2['id'] . ','; 98 echo $row2['name'] . ','; 99 echo $row2['comment'] . ','; 100 echo $row2['time'] . '<br>'; 101} 102?>

投稿2019/02/14 02:38

編集2019/02/14 03:24
m.ts10806

総合スコア80850

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

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

watoson

2019/02/14 03:30

親切にしていただいてありがとうございます。削除ボタンが見つからなかったので問い合わせからから削除依頼を出してきました。 エラーも一応解決しました。新たなエラーも出てきましたが自分なりにあがいて、もしだめならまた質問させて頂こうと思っています。 今回は自分の不手際でご迷惑をおかけして申し訳ありませんでした。
m.ts10806

2019/02/14 03:44

削除ポリシーにもありますが回答がついた質問は直接削除依頼ができなくなっています。 私の方もまさかパスそのまま提示されると思ってなかったので先に回答してしまいました。 ひとまず編集で****などにしておくと良いです。 ちなみに 私が回答でコメント指摘したところを丁寧に対応できればその後のエラーも解決できると思います。 まずはインデント、次に変数名の適正化、次にロジック改善 ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問