サーバー(PHP,SQL)と連携したEAを作りたいということでいろいろ検証しましたが、その中で特にはまった点がありました。
phpでechoした文字列がMQLのComment関数ですべて表示されない・・・
ということでした。これだと、デバッグができないTTや、データをEAに渡したいときに欠損してしまいます。
そんな2日間の奮闘の備忘録です。
サーバーのプログラムの検証
・POSTのリクエストで正常にサーバープログラムが動作しているか?
簡単なフォームを作って、POSTリクエストをすることで、サーバー側のプログラムが正常かどうかを調査しました。
<form action="送信先URL" method="post"> <div> <label for="value1">value1値</label> <input name="value1" id="value1" value="1"> </div> <div> <label for="value2">value2値</label> <input name="value2" id="value2" value="10"> </div> <div> <button>Send my greetings</button> </div> </form>
formtest.html
慣れていないMQLから直接POSTしてもわからないので、普通にhtmlのフォームからPOSTすることで、ちゃんと動作しているか確認です。
FTPでアップロードして、URL/formtest.htmlで値を入れて出力すると、正常にブラウザ上にechoされました。
ということは、PHPプログラムは正常に動作していそうです。このようなフォームから値も投げられるので、実際にEAを作成するときには、不正アクセスできないような仕組みも必要になってきます。開発段階ではデバッグに使いますが^^;
MQL側の検証
・MQLのComment関数の最大文字数がオーバーしていないか?
ここは全然問題ないと思っているのですが、一応・・・検索しても大丈夫そうなので、問題なさそう。Print、MessageBox関数でも同じように全部の文字列が返ってきてない(同じ文字列)のでとりあえずいったん保留として次に。
・そもそもデータがちゃんと受け取れているか?
WebRequest関数で取得できるレスポンス文字列を調べる。
結局、ここが罠でした。
WebRequestで戻ってくるデータは、char型の配列。これをCharArrayToStringで変換して文字列として出力するのです。
しかし、Char型の配列の中身に実際データが到達しているか?は見れていなかったので^^;
一文字づつ確認しました。
Print(ReceivedData[0]);
配列の[0]には、68、[1]には66ちゃんと「DB」と入ってきています。(68、66はASCIIコード)
順番に[1]、[2]と調べていくと、文字列が切れる前には、0の値が入っていました。そして、そのあとは、本来表示してほしい文字のASCIIコードが入ってきていました。
結論
CharArrayToString関数は、0を渡すとそこで変換が終了?するので、char配列のどこかに0が来たら、空白(32)などに変換して最後まで文字列を出力できるようにする。
検証の方法など模索したりしているうちに2日ほど経過していました^^;