前提・実現したいこと
DBに登録済みのデータをUPDATEしたいのですが、エラーが出ています。
実現したいこと : if文で分岐して、foreachで回して、sql文を作成して、バインドができるようになりたいです。
初心者です。
要領を得ない質問かもしれませんが、よろしくお願いします。
PHPで会員登録ができるシステムを作っています。
会員登録変更機能を実装中に以下のエラーメッセージが発生しました。
変更予定箇所のDBデータ型は全て varchar
owner_email のみ unique 設定
発生している問題・エラーメッセージ
エラーメッセージ 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 'WHERE owner_id = ?' at line 1 in /Applications/MAMP/htdocs/hoge_hoge/owner/owner_edit_info_done.php:270 Stack trace: #0 /Applications/MAMP/htdocs/hoge_hoge/owner/owner_edit_info_done.php(270): PDO->prepare('UPDATE owner_in...') #1 {main}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 'WHERE owner_id = ?' at line 1 **** owner_edit_info_done.php:375 $prepare->execute(); **** ### 該当のソースコード PHP 7.4.1 //sql文作成のためのターゲット 変更内容がPOSTされているときだけ配列に格納する if (isset($post['owner_name_rubi'])) { $target[] = 'owner_name_rubi'; } if (isset($post['owner_name'])) { $target[] = 'owner_name'; } if (isset($post['zip1'])) { $target[] = 'zip1'; } if (isset($post['zip2'])) { $target[] = 'zip2'; } if (isset($post['pref'])) { $target[] = 'pref'; } if (isset($post['address1'])) { $target[] = 'address1'; } if (isset($post['address2'])) { $target[] = 'address2'; } if (isset($post['owner_phone_home'])) { $target[] = 'owner_phone_home'; } if (isset($post['owner_phone_mobile'])) { $target[] = 'owner_phone_mobile'; } if (isset($post['owner_fax'])) { $target[] = 'owner_fax'; } if (isset($post['owner_email'])) { $target[] = 'owner_email'; } //foreachでsql文を作成 $s = []; foreach ($target as $key => $values) { $s[] = $target[$key] . " = :" . $target[$key]; } $s = implode(",", $s); $sql = "UPDATE owner_info SET " . $s . " WHERE owner_id = :owner_id"; //名前付きプレースホルダー $prepare = $dbh->prepare($sql); // sql文のバインド処理。変更入力されたもののみ postデータを変数に代入済み if (isset($post['owner_name_rubi'])) { $prepare->bindValue(':owner_name_rubi', (string) $owner_name_rubi, PDO::PARAM_STR); } if (isset($post['owner_name'])) { $prepare->bindValue(':owner_name', (string) $owner_name, PDO::PARAM_STR); } if (isset($post['zip1'])) { $prepare->bindValue(':zip1', (string) $zip1, PDO::PARAM_STR); } if (isset($post['zip2'])) { $prepare->bindValue(':zip2', (string) $zip2, PDO::PARAM_STR); } if (isset($post['pref'])) { $prepare->bindValue(':pref', (string) $pref, PDO::PARAM_STR); } if (isset($post['address1'])) { $prepare->bindValue(':address1', (string) $address1, PDO::PARAM_STR); } if (isset($post['address2'])) { $prepare->bindValue(':address2', (string) $address2, PDO::PARAM_STR); } if (isset($post['owner_phone_home'])) { $prepare->bindValue(':owner_phone_home', (string) $owner_phone_home, PDO::PARAM_STR); } if (isset($post['owner_phone_mobile'])) { $prepare->bindValue(':owner_phone_mobile', (string) $owner_phone_mobile, PDO::PARAM_STR); } if (isset($post['owner_fax'])) { $prepare->bindValue(':owner_fax', (string) $owner_fax, PDO::PARAM_STR); } if (isset($post['owner_email'])) { $prepare->bindValue(':owner_email', (string) $owner_email, PDO::PARAM_STR); } // WHERE 変更箇所を指定する owner_id をバインド sessionデータを変数に代入済み $prepare->bindValue(':owner_id', (string) $owner_id, PDO::PARAM_STR); // sql文実行 $prepare->execute(); ソースコード
試したこと
パスワードは単体で変更するようにしたのですが、そちらはこの流れで変更ができました。(バインド箇所はIDとパスワードの2カ所、IDは非公表でログイン時にsessionに渡したデータから取得)
今は前ページからPOSTがある箇所をifで分岐する仕様にしていますが、全ての項目をバインドしていた時もエラーが出ていました。
仕様上、nullの項目も必要なので、ifでの分岐を考えました。
HTMLのformからは、現在登録情報をinputのvalueに入れて渡しています。
$count = 0;
$columns = '';
$values = '';
foreach (array_keys($params) as $key) {
if ($count++ > 0) {
$columns .= ',';
$values .= ',';
}
$columns .= $key;
$values .= ':' . $key;
}
$sql = 'update owner_info (' . $columns . ')values(' . $values .
') WHERE owner_email = :owner_email'; //名前付きプレースホルダー
このような形のsql文の作成も試しましたが、上手くいきませんでした。
補足情報(FW/ツールのバージョンなど)
PHP 7.4.1
Apache/2.2.34
mysqlnd 7.4.1
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー