オブジェクト型に配列を代入したらこのエラーが発生しました。
一応状況を説明すると、ajaxでjsのオブジェクトを送信した際にJSON.stringify()をかけるのを忘れていてオブジェクトが配列型になってサーバーに送られ、それをPHPのオブジェクトに代入してエラーとなった模様。
オブジェクト型に配列を代入したらこのエラーが発生しました。
一応状況を説明すると、ajaxでjsのオブジェクトを送信した際にJSON.stringify()をかけるのを忘れていてオブジェクトが配列型になってサーバーに送られ、それをPHPのオブジェクトに代入してエラーとなった模様。
『"(ダブルコーテーション)』
『\(バックスラッシュ)』
『/(スラッシュ)』
『\b(バックスペース)』
『\f(改ページ)』
『\n(改行)』
『\r(キャリッジリターン)』
『\t(バックスペース)』
JSONでは上記の文字を含めるときにエスケープしなければいけません。プログラムのソースコードとかを記事に書くと""や/などはよく使うので引っかかり安いです。
そこまではまあ当たり前なのですが、今回引っかかったのはUrlエンコードとの兼ね合いでした。
"あ"
という文字列を$.ajaxで送信する時に、先にencodeURIComponent()でUrlエンコードし、その後JSON.stringify()でStringにしたものをPHP側に渡し、urldecode()しjson_decode()すると失敗します。
これはurldecodeした時のJSONが{"data":""あ""}みたいになってしまうからです。
$.serialiseでフォームのデータを取得し、それを加工したものをJSON.stringify()して送信したらこうなりました。
通常はJSON.stringify()がエスケープ文字を追加してくれますが、Urlエンコードされた文字は%22みたいになっておりエスケープ文字ではないのでエスケープされずにPHP側に渡ってしまうわけです。
なので私は$.serialise($.serializeArray)で取得したデータをdecodeURIComponent()してからJSON.stringify()でエスケープ&JSON化してencodeURIComponent()でUrlエンコードし直してPHPに渡しました。
そこでふと疑問に思ったのはajax通信でもUrlエンコードって必要なのだろうか?ってことですが、やっておいて損はなさそうなのでやっておきました。
新サイトを作ってアップロードしたらHTTP ERROR 500が発生してしまいました。
原因は単なるDB接続用の設定ミス。
よくあるいつものミスです。
2019-05-22
またまたこのエラーが発生しました。php5.6 → php7に変えたら「Error establishing a database connection」と出て接続できなくなりました。
レンタルサーバー(ロリポップ)の説明によるとphp7のセキュリティ強化でold_password形式をnative_password形式に変更する必要があるとのことでパスワードを再設定しました。
wp-config.phpを書き換えてアップロードすればOK。
なお、php.iniのdisplay_errorsをonにしてみたらエラーが出るわ出るわ。バグつぶしを1つ1つ丁寧にやっておきました。
参考リンク
2019-05-23
別のサイトでまたHTTP ERROR 500が発生。こちらは存在しないクラスでnewしてただけでした。そこをコメントアウトしただけで直りました。
bad
$stmt->bindValue(‘:id’, 1, “PDO::PARAM_INT”);
good
$stmt->bindValue(‘:id’, 1, PDO::PARAM_INT);
関連リンク
PDOでカラム一覧(フィールド名・列名)を取得する方法のメモ。
カラム名だけを取得するのではなくレコードを取得する時に一緒に取ってきたかったのでこんな感じにしました。
$recs = $pdo->fetchAll(PDO::FETCH_ASSOC);
$keys = array_keys($recs[0]);
foreach($keys as $key){
$th .= ‘<th>’.$key.'</th>’;
}
[PHP5]PDOのfetchAllでフィールド名がキーの配列を取得 – Develog –
カラム名だけ、あるいはカラム情報を取得するなら以下のSQL文で一覧が取得できます。
DESCRIBE テーブル名; OR show columns from テーブル名;