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

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

ただいまの
回答率

89.52%

データベースの変更ページ作成していますが、エラーメッセージが流れます。

解決済

回答 2

投稿 編集

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

rozeo

score 12

前提・実現したいこと

PHPでデータベースのフィールドをブラウザから編集するページを作っています。
更新ボタンを押すと以下のメッセージが流れてしまいます。

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

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE (cd_no = '$cd_no')' at line 23' in C:\pleiades\xampp\htdocs\◆\update.php:185 Stack trace: #0 C:\pleiades\xampp\htdocs\◆\update.php(185): PDOStatement->execute(Array) #1 {main} thrown in C:\pleiades\xampp\htdocs\◆\update.php on line 185

該当のソースコード

<?php

header("Content-type: text/html; charset=utf-8");

define('DB_DATABASE', '◆');
define('DB_USERNAME', '◆');
define('DB_PASSWORD', '◆');
define('PDO_DSN', 'mysql:dbhost=◆;dbname=' . DB_DATABASE);


// get parameters.
if($_SERVER["REQUEST_METHOD"] != "POST"){
    // ブラウザからHTMLページを要求された場合
    $cd_no= $_GET["cd_no"];
    $date_new = $_GET["date_new"];  // 登録日
    $date_up = $_GET["date_up"];  // 更新日
    $db_server_name = $_GET["db_server_name"];  // データベースサーバー
    $db_name = $_GET["db_name"];  // データベース名
    $db_user = $_GET["db_user"];  // データベースユーザー
    $db_password = $_GET["db_password"];  // データベースパスワード
    $dealer_name = $_GET["dealer_name"];  // ディーラー名
    $dealer_name_kana = $_GET["dealer_name_kana"];  // ディーラー名カナ
    $postal_code = $_GET["postal_code"];  // 郵便番号
    $prefecture = $_GET["prefecture"];  // 都道府県
    $city = $_GET["city"];  // 市区町村
    $address1 = $_GET["address1"];  // 住所1
    $address2 = $_GET["address2"];  // 住所2
    $tel = $_GET["tel"];  // 電話
    $fax = $_GET["fax"];  // ファックス
    $url = $_GET["url"];  // URL
    $president = $_GET["president"];  // 代表者
    $delete_flag = $_GET["delete_flag"];  // 削除フラグ
    $dealer_id = $_GET["dealer_id"];  // ディーラーID
    $dealer_password = $_GET["dealer_password"];  // dealer_password
    $connection_name = $_GET["connection_name"];  // connection_name

}else{
    // フォームからPOSTによって要求された場合
    $cd_no= $_POST["cd_no"];
    $date_new = $_POST["date_new"];  // 登録日
    $date_up = $_POST["date_up"];  // 更新日
    $db_server_name = $_POST["db_server_name"];  // データベースサーバー
    $db_name = $_POST["db_name"];  // データベース名
    $db_user = $_POST["db_user"];  // データベースユーザー
    $db_password = $_POST["db_password"];  // データベースパスワード
    $dealer_name = $_POST["dealer_name"];  // ディーラー名
    $dealer_name_kana = $_POST["dealer_name_kana"];  // ディーラー名カナ
    $postal_code = $_POST["postal_code"];  // 郵便番号
    $prefecture = $_POST["prefecture"];  // 都道府県
    $city = $_POST["city"];  // 市区町村
    $address1 = $_POST["address1"];  // 住所1
    $address2 = $_POST["address2"];  // 住所2
    $tel = $_POST["tel"];  // 電話
    $fax = $_POST["fax"];  // ファックス
    $url = $_POST["url"];  // URL
    $president = $_POST["president"];  // 代表者
    $delete_flag = $_POST["delete_flag"];  // 削除フラグ
    $dealer_id = $_POST["dealer_id"];  // ディーラーID
    $dealer_password = $_POST["dealer_password"];  // dealer_password
    $connection_name = $_POST["connection_name"];  // connection_name
    $sub1 = $_POST["sub1"];
    try{
        $db = new PDO(PDO_DSN, DB_USERNAME,DB_PASSWORD);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e){
        echo  $e->getMessage();
        exit;
    }

    //データを変更する
    // UPDATE文を変数に格納
    $sql = "UPDATE mdealers SET
    date_new = :date_new,
    date_up = :date_up,
    db_server_name = :db_server_name,
    db_name = :db_name,
    db_user = :db_user,
    db_password = :db_password,
    dealer_name = :dealer_name,
    dealer_name_kana = :dealer_name_kana,
    postal_code = :postal_code,
    prefecture = :prefecture,
    city = :city,
    address1 = :address1,
    address2 = :address2,
    tel = :tel,
    fax = :fax,
    url = :url,
    president = :president,
    delete_flag = :delete_flag,
    dealer_id = :dealer_id,
    dealer_password = :dealer_password,
    connection_name = :connection_name,
    WHERE (cd_no = :cd_no);";
    // 更新する値と該当のIDは空のまま、SQL実行の準備をする
    $stmt = $db->prepare($sql);


    // 更新する値と該当のIDを配列に格納する
    $params = array(
            ':date_new' => '$date_new',
            ':date_up' => '$date_up',
            ':db_server_name' => '$db_server_name',
            ':db_name' => '$db_name',
            ':db_user' => '$db_user',
            ':db_password' => '$db_password',
            ':dealer_name' => '$dealer_name',
            ':dealer_name_kana' => '$dealer_name_kana',
            ':postal_code' => '$postal_code',
            ':prefecture' => '$prefecture',
            ':city' => '$city',
            ':address1' => '$address1',
            ':address2' => '$address2',
            ':tel' => '$tel',
            ':fax' => '$fax',
            ':url' => '$url',
            ':president' => '$president',
            ':delete_flag' => '$delete_flag',
            ':dealer_id' => '$dealer_id',
            ':dealer_password' => '$dealer_password',
            ':connection_name' => '$connection_name',
            ':cd_no' => '$cd_no'
    );


//var_dump( $params );


    // 更新する値と該当のIDが入った変数をexecuteにセットしてSQLを実行
    $stmt->execute($params);

//var_dump( $stmt );

    // クリックでリンクに飛ぶ
    $list = 'http://localhost/◆/list.php';
    header("Location: {$list}");
}
//var_dump( $cd_no );


echo "<!DOCTYPE html>";
echo "<html>";
echo "<head>";
echo "<body>";

echo  $cd_no. ':' . $date_new . ':' . $date_up . ':' . $db_server_name . ':' . $db_name . ':' . $db_user . ':' . $db_password . ':' . $dealer_name . ':' . $dealer_name_kana . ':' . $postal_code . ':' . $prefecture . ':' . $city . ':' . $address1 . ':' . $address2 . ':' . $tel . ':' . $fax . ':' . $url . ':' . $president . ':' . $delete_flag . ':' . $dealer_id . ':' . $dealer_password . ':' . $connection_name. '<br>';
//echo $sub1 . '<br>';


echo "<form method=\"POST\" action=\"".$_SERVER["PHP_SELF"]."\">";
echo "<tr>";

echo "<input type=\"hidden\" value=\"".$cd_no."\" name=\"cd_no\">";
echo "<td><input type=\"text\" name=\"date_new\" value=\"".$date_new."\"></td>";
echo "<td><input type=\"text\" name=\"date_up\" value=\"".$date_up."\"></td>";
echo "<td><input type=\"text\" name=\"db_server_name\" value=\"".$db_server_name."\"></td>";
echo "<td><input type=\"text\" name=\"db_name\" value=\"".$db_name."\"></td>";
echo "<td><input type=\"text\" name=\"db_user\" value=\"".$db_user."\"></td>";
echo "<td><input type=\"text\" name=\"db_password\" value=\"".$db_password."\"></td>";
echo "<td><input type=\"text\" name=\"dealer_name\" value=\"".$dealer_name."\"></td>";
echo "<td><input type=\"text\" name=\"dealer_name_kana\" value=\"".$dealer_name_kana."\"></td>";
echo "<td><input type=\"text\" name=\"postal_code\" value=\"".$postal_code."\"></td>";
echo "<td><input type=\"text\" name=\"prefecture\" value=\"".$prefecture."\"></td>";
echo "<td><input type=\"text\" name=\"city\" value=\"".$city."\"></td>";
echo "<td><input type=\"text\" name=\"address1\" value=\"".$address1."\"></td>";
echo "<td><input type=\"text\" name=\"address2\" value=\"".$address2."\"></td>";
echo "<td><input type=\"text\" name=\"tel\" value=\"".$tel."\"></td>";
echo "<td><input type=\"text\" name=\"fax\" value=\"".$fax."\"></td>";
echo "<td><input type=\"text\" name=\"url\" value=\"".$url."\"></td>";
echo "<td><input type=\"text\" name=\"president\" value=\"".$president."\"></td>";
echo "<td><input type=\"text\" name=\"delete_flag\" value=\"".$delete_flag."\"></td>";
echo "<td><input type=\"text\" name=\"dealer_id\" value=\"".$dealer_id."\"></td>";
echo "<td><input type=\"text\" name=\"dealer_password\" value=\"".$dealer_password."\"></td>";
echo "<td><input type=\"text\" name=\"connection_name\" value=\"".$connection_name."\"></td>";
echo "<td><input type=\"submit\" value=\"変更\" name=\"sub1\"></td>";
echo "</tr>";
echo "</form>";


echo "</body>";
echo "</html>";

試したこと

bindParam、bindValueを試したのですが同様のエラーが出ます。
同様のプログラムで項目数が少ないものは上手くいっているため、データベース側の問題なのでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2017/08/25 13:59

    プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)

    キャンセル

  • m.ts10806

    2017/08/25 14:00

    line 185はどこでしょうか?ご提示いただいたソースは180行までしかないようですが。

    キャンセル

  • rozeo

    2017/08/25 14:18

    後程必要箇所は修正いたします。ご指摘ありがとうございます。

    キャンセル

回答 2

+2

単純に

':cd_no' => '$cd_no'
ここでシングルクォートでくくっているので$cd_noが展開されていない

':cd_no' => $cd_no
としてください
同様の記述がいくつかあるのでおしなべて同じ対応をしてください

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/25 14:15

    ありがとうございます。別回答とあわせて、非常に参考になりました。

    キャンセル

checkベストアンサー

+1

ぱっとみ

':date_new' => '$date_new',
':date_up' => '$date_up',
':db_server_name' => '$db_server_name',
':db_name' => '$db_name',
':db_user' => '$db_user',
':db_password' => '$db_password',
':dealer_name' => '$dealer_name',
':dealer_name_kana' => '$dealer_name_kana',
':postal_code' => '$postal_code',
':prefecture' => '$prefecture',
':city' => '$city',
':address1' => '$address1',
':address2' => '$address2',
':tel' => '$tel',
':fax' => '$fax',
':url' => '$url',
':president' => '$president',
':delete_flag' => '$delete_flag',
':dealer_id' => '$dealer_id',
':dealer_password' => '$dealer_password',
':connection_name' => '$connection_name',
':cd_no' => '$cd_no'

の値側に関して変数名を''で囲う必要がなさそう

あとSQL文に於いての

connection_name = :connection_name, // <- この,でSQL文法エラーになりそう
WHERE (cd_no = :cd_no);";

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/25 14:07

    connection_name = :connection_name, // <- この,でSQL文法エラーになりそう
    WHERE (cd_no = :cd_no);";

    まさしくこの通りでした。どうもありがとうございます。

    キャンセル

  • 2017/08/25 14:11 編集

    別解答および私の解答にも書いてますが、
    変数をシングルコーテーションで囲ってるのも対応しないと
    '$cd_no'
    はそのまま$cd_noっていう文字列を表しますのでご注意を

    キャンセル

  • 2017/08/25 14:14

    ありがとうございます。合わせて対応しましたところ、無事に出来ました。

    キャンセル

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

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

同じタグがついた質問を見る