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

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

ただいまの
回答率

90.01%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 348

watoson

score 9

前提・実現したいこと

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/ツールのバージョンなど)

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/02/14 11:55

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

    キャンセル

  • m.ts10806

    2019/02/14 11:57

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

    キャンセル

  • m.ts10806

    2019/02/14 11:59

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

    キャンセル

回答 3

+3

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/14 12:37

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

    キャンセル

+3

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/14 12:38

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

    キャンセル

checkベストアンサー

+2

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

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

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


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

<?php
$named=$_POST['content'];
$commented=$_POST['content2'];
$deleted=$_POST['number'];
$edited=$_POST['edit'];
$editnumber=$_POST['content3']; //mts10806 取得してるけどどこにも使ってない
$passed=$_POST['pass'];
$pass2=$_POST['pass2'];
$pass3=$_POST['pass3'];
$timed = date('Y/n/d H:i:s');
// データベース接続
$dsn = 'mysql:dbname=test;host=localhost';
$user = 'root';
$password = '';
$pdo = new PDO($dsn, $user, $password, array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
));

//mts10806 DBに関する処理を行うときはきちんとtry-catchしてException(今回はPDOException)を捕捉するようにしましょう

// テーブル作成
$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>";

//mts10806 変数名や関数名にマジックナンバーは厳禁。何を保管しているものか、何をするものかわからない。prepareの返りはstatementなのでsqlという変数名もナンセンスです。

$sql3 = $pdo->prepare("INSERT INTO mission_4_1(id,name,comment,time,pass) VALUES(:id,:name,:comment,:time,:pass)");
//mts10806 auto_increment設定しているならinsertにidは基本不要
$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);
//mts10806 どっちかに統一を。bindValueの方がのぞましい。

$name = $named; //mts10806 ここで定義してもbindParam,BindValueで使うことにはならない
$comment = $commented;
$time = $timed;
$pass = $passed;

$sql3->execute(); //mts10806 SQLで用意したパラメータとセットしたパラメータの数があわないのでエラーでますよ。

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)) {
//mts10806 なんでこの前までbindしてきてるのになぜここでやらない・・
    $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>';
}
?>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/14 12:30

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

    キャンセル

  • 2019/02/14 12:44

    削除ポリシーにもありますが回答がついた質問は直接削除依頼ができなくなっています。
    私の方もまさかパスそのまま提示されると思ってなかったので先に回答してしまいました。
    ひとまず編集で****などにしておくと良いです。

    ちなみに
    私が回答でコメント指摘したところを丁寧に対応できればその後のエラーも解決できると思います。
    まずはインデント、次に変数名の適正化、次にロジック改善 ですね。

    キャンセル

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

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