脱力系備忘録BloG ホーム »PHP

JavaScript FetchでのJSON.parseエラーで悩んだ  

JavascriptのfetchでPHPと非同期通信処理を行う仕組みを作ってました。
この仕組み自体は今までも経験あるのですが、今回はどういうわけか、

JSON.parse: unexpected character at line 1 column 1 of the JSON data

というJavascriptのエラーが発生してその原因を探るのに無駄な時間を割いてしまいましたので備忘録。

JSON_parse_error.png

結論を申しますと、PHPがJSONを書き出す前に余計なテキストを書き出していたのが原因です。

もちろん、真っ先にJSONの書き出しが怪しいと思いました。
それでPHPが書き出すJSONデータをメールで送信して中身を確認したのですが、全く問題が見つからず。
過去に作ったプログラムと比較したりして何が違うかバグ探しをしたけどわからず。

で、やけになってJavascriptのコードの

return response.json();

という箇所を

return response.text();

にして受信内容をconsole.log()で表示してみたらJSONデータの前に余計な文言が書き出されてました。

原因は、外部PHPファイルを読み込んでいるのですが、その読み込むPHPファイルがテスト環境用のもので、その中にテスト用のコメントを書き出す部分が入っていたのが原因でした。
このテスト用PHPファイルをAJAX非同期通信システムで利用するのが初めてだったので、そのようなコメント書き出しがあるなんてことに気が付きませんでした。


理由がわかれば「なんだそんなこと?」ということに限ってなかなかバグが見つからないものです。

とりあえず、非同期処理でJSONデータを受け取るときに

JSON.parse: unexpected character at line 1 column 1 of the JSON data

というエラーが出たときは必ず余計な文字が書き出されているので、それを確認しましょう。

category: PHP JavaScript

PHP7.4で動作テストしてたら大量の配列エラーがでる  

これが
Trying to access array offset on value of type null
大量に出る。

PHP7.4では「配列でない値を配列スタイルでアクセスした場合」に警告がでるようになったようです。

例えば
<?PHP
echo $a[1];
?>

このように何も定義されてない状態の変数に配列としてアクセスするとエラーが出るというわけです。

こういうの結構書いちゃってます・・・。

配列として使うつもりだがまだ配列として中身が入ってない場合もあるという変数に配列形式でアクセスするプログラム。結構書いてるねえ。


何らかの対策が必要だとは思いますが・・・、

エラー制御演算子で
<?PHP
echo @$a[1];
?>

ごまかしちゃうとか・・・
E_NOTICEを・・・

上記例のような未定義変数に配列アクセスする場合は「Null合体演算子(??)」できちんと処理するべきでしょうけど・・・

category: PHP

透過指定のあるPNGをimagejpegで出力すると黒く塗りつぶされる  

256色以下のパレットカラーの場合のPNG画像に透過指定がある場合、サイズ変更しない場合はなにも考えず、

$im = imagecreatefrompng('256色透過.png');
header('Content-type: image/jpeg');
imagejpeg($im, NULL, 70);

で問題なく出力されます。

しかし、リサイズする場合はちょっと工夫しないとJPEG出力したときに透過部分が黒くなってしまいます。
特に、透過指定のあるフルカラーPNGの場合は、リサイズしなくても黒く塗りつぶされてしまいます。

試行錯誤した結果、透過部分を指定した色で塗りつぶすという方法で解決とする。


$imIn = imagecreatefrompng('透過指定のある.png');

$x = imagesx($imIn);
$y = imagesy($imIn);

$imOut = imagecreatetruecolor($x,$y);

#背景を白にする場合
imagefill($imOut, 0, 0, imagecolorallocate($imOut, 255, 255, 255));

imagecopyresampled($imOut,$imIn,0,0,0,0,$x,$y,$x,$y);

header('Content-type: image/jpeg');
imagejpeg($imOut, NULL, 70);


これで透過部分に任意の色がついた状態でJPEG出力されます。

category: PHP

PHPでリサイズしたPNG画像の透過背景が真っ黒になる  

imagesavealpha()関数を使用すればOK。


$im = imagecreatefrompng('PNG画像ファイル名');

#imagesavealpha関数を使用するためには アルファブレンディングを無効にする必要がある
imagealphablending($im, false);
imagesavealpha($im, true);

imagepng($im);

category: PHP

PHPとPostgreSQLで正規表現を使ったAND検索  

PostgreSQLで文字列のAND検索を正規表現でできんかなあ。

と思ったらできた。

category: データベース PHP

PHPの文字列と数値の比較であせった パート2  

●判定例1
('AA' == '')
これは FALSE。

●判定例2
('AA' == false)
これは FALSE。

●判定例3
('AA' == 0)
これは TRUE。

なんだかなぁ。なんでなんだろうなぁ。

こちらも参考にどうぞ。
PHPの文字列と数値の比較であせった

category: PHP

preg_replace_callback のコールバック関数に複数引数を指定したい  

PHPに「preg_replace_callback」という関数があります。

使い方は

preg_replace_callback(正規表現パターン, コールバック関数, 置換元文字列);

です。

正規表現に「([0-9]+)」みたいなグループ指定があり、その値を利用して作成された文字列で置換を行いたいときにとても便利です。

単純に正規表現マッチだけをコールバック関数で利用する場合は簡単で、

preg_replace_callback('/([0-9]{3})-([0-9]{4})/', function ($matches) { return sprintf('%03d%04d', $matches[1], $matches[2]); }, $strings);

こんな感じで使えます。

しかし、今回コールバック関数に複数引数を指定する方法で困っていろいろ試してみたので備忘録メモ。

category: PHP

ロボットを排除する画像認証(CAPTCHA)をPHPで作ってみた  

煮卵黒ギャルが似ているというこれを見て感動しました。

そして、この相似関係を有効活用できないか?と思い、多角的にさまざまな黒ギャル画像を観察してみると、

「CAPTCHA技術に応用できるのではないだろうか?」

と気づき、作成したのが「にたまごCAPTCHAniCAPTCHA』」です。

category: PHP

HTTP_Request2でファイルをアップロードしたらエラーになる  

以下のようなエラーが返ってくる。
417 Expectation Failed

Expectation Failed

The expectation given in the Expect request-header
field could not be met by this server.
The client sent

Expect: 100-continue

Only the 100-continue expectation is supported.

$req->setHeader('Expect', '');
を記載するとうまくいく。

category: PHP

PHPのファイル関連関数でSSLを使った接続をしようとしたら接続できない  

PHP5.6で「file_get_contens」や「fopen」を使って「https://~」で始まるリモートファイルにアクセスしようとしたら、

Warning: fopen(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in Command line code on line 1

とか

SSL operation failed

とかいうエラーを出して接続に失敗する。

なぜだ?

OpenSSLはインストールされている。もちろん、PHPのコンパイル時にも「configure」で組み込んでいる。

phpinfo()」を確認。

Registered PHP Streams
https」が記載されている。

allow_url_fopen
当然ながら、「On」だ。

うーむ。
あとやってないことと言えば・・・

「ふえぇぇぇぇ。PHPマニュアルちゃんと読んでなかったよぅ」

ということで今からバージョン変更時の注意書きを読みに行く

PHP 5.6.x における OpenSSL 関連の変更

書いてある。

category: PHP

プロフィール

お問い合わせ

最新記事

最新コメント

▲ Pagetop