何と

今朝は早朝より悩みました

 

<?php
ini_set(‘allow_url_fopen’, 0);

これがエラーとなるのです そのエラーは何やら constantがどうのこうのというものでした

結局 stackoverflowを検索した所、 「おまえさん、それは quotationが間違っているよ」というものでした

つまり

<?php
ini_set('allow_url_fopen', 0);

とすれば良いのでした 当たり前のことですね でもついついこの英語Keyboad上では、日本語配列では「や」にあたる’と「@」にあたる`というのは見てくれが似ているけど意味が全く異なるので間違えますね

特に SQL文を php scriptの中に埋め込む時などにとてもややこしいです 今回もそのような一例でした

Slender Clubライブ一例目終了

昨日は湘南鎌倉総合病院から品川プランスホテルで開催されている Slender Club Tokyo in 2018へのライブ症例中継の日です

これまで僕自身はこの病院からもたくさんのライブを全世界に向けて飛ばしてきましたので、特に緊張することも慌てることもありません そういう意味では、よく議論になっているライブ中継の欠点、つまり — 術者やスタッフが緊張してしまい、普段の実力を出せなくなり、その結果、患者さんに不利益となる — ということからは僕自身そしてコメディカルも含めたスタッフは無縁です

逆にこのようなライブでは会場におられるたくさんの全世界の expertsの貴重な意見を真摯に聞ける、その結果 より良い治療を行える可能性が高まる、そのような利点が際立ってきます

まあそんなこんなで自分の割当分の患者さんは無事成功裏に二例治療することができました 特に一例目の方は非常に危険が予想される患者さんであり、あまり調子に乗って(つまりライブという環境の中で他の人の行け、行けという意見に押されて)攻めすぎると危険な事態に陥る、そのようなことが僕の誰よりも多くPCIをしてきた人生の経験から感じていました 結果は、押しすぎずある妥協点で終了し、手技は成功し、治療の目的は達成し、かつ無事に終了しました

ここいら辺のPCIというかどんな治療にも共通するであろう真実をどれぐらいの人々、特に若い先生方に理解して頂けるは? 言葉では伝えにくいものがありますね もうかれこれ 30年ぐらい前になりますが、そう昭和の終わりに、日本のとても偉い方が腹部臓器の悪性腫瘍となられ、某国立有名大学の外科の教授が根治手術をされたのですが、明らかにその手術は限界を越えたものだったと思います もちろん僕は腹部外科手術に詳しくありませんので、間違っていたらばすみません 何れにしてもその方は手術を契機に亡くなられました そんなことをどうしても思い出します

さてさてそんなことを考えながら本日は朝から昼のdutyまで懸案のプログラミングにとりかかっています 昨日来「あれ? 何で?」ということがあり、その疑問にすっかり取り憑かれ、どうすればこの疑問を解消できるか? そんなことに悩みながら座長をしたりしていたのです

結果的に解決しました これまであまり深く考えずに慣習に則ってやってきたからこんな事態に直面したのですね 反省です こんなことはこれまで jQueryを使い始めてから、ですから 10年ぐらい前から何回も何回も知っている筈のことだったのです 分かりやすくプログラムで書きますね

<!doctype html>
<html>
  <head>
    <title>TEST PROGRAM</title>
    <meta charset="utf-8">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
  </head> 
<body> 
<form action="http://www.kamakuraheart.org/wordpress/" method="post"> 
<button type="submit" id="btn">ブログに飛ぶ</button> 
</form> 
<script> 
$('#btn').on('click', function() { 
    if (!confirm('本当にブログに飛びますか?')) { 
        return false; 
    } else { 
        location.href='http://www.kamakuraheart.org/wordpress/'; 
    } 
}); 
</script>
</body> 
</html>

これは勿論動作します しかし、次のプログラムは動作しません

<!doctype html>
<html>
  <head>
    <title>TEST PROGRAM</title>
    <meta charset="utf-8">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<script> 
$('#btn').on('click', function() { 
    if (!confirm('本当にブログに飛びますか?')) { 
        return false; 
    } else { 
        location.href='http://www.kamakuraheart.org/wordpress/'; 
    } 
}); 
</script>
  </head> 
<body> 
<form action="http://www.kamakuraheart.org/wordpress/" method="post"> 
<button type="submit" id="btn">ブログに飛ぶ</button> 
</form> 

</body> 
</html>

何故でしょうか <script></script>の位置に注目して下さい jQueryが対象としているオブジェクトは ‘#btn’ですが、それは DOMでは <button></button>の中で id = ‘btn’として指示されているものです

つまり、この作動しないプログラムでは、jQueryが id = ‘btn’というオブジェクトを探しに行っても、未だ DOMの中に読み込まれていないので、jQueryは分からないのです もちろんhtmlも上から順番に読み込まれます

では次のプログラムはどうでしょうか?

<!doctype html>
<html>
  <head>
    <title>TEST PROGRAM</title>
    <meta charset="utf-8">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<script> 
jQuery(document).ready(function() {
  $('#btn').on('click', function() { 
      if (!confirm('本当にブログに飛びますか?')) { 
          return false; 
      } else { 
          location.href='http://www.kamakuraheart.org/wordpress/'; 
      } 
  });
}); 
</script>
  </head> 
<body> 
<form action="http://www.kamakuraheart.org/wordpress/" method="post"> 
<button type="submit" id="btn">ブログに飛ぶ</button> 
</form> 

</body> 
</html>

これはきちんと作動します 何が変わったのでしょうか? jQueryによるプログラム(スクリプト)全体が jQuery(document).ready(function() {})で括られていますね これが意味するところは、htmlのプログラム全体が読み込まれて DOM解析が終了するまで jQueryに待ちなさい、ということを指示しているのです

実はこんなこと jQueryを使うに際しては当たり前のことです ですから、いちいち jQuery(document).ready(function() {})でくくるのは面倒なので </body>タグの直前に jQueryスクリプトを書くように推奨されているのです こんなことすっかり忘れてしまい、これまで慣習で</body>タグの直前に jQueryスクリプトを書いてきたのですが、それを<head></head>に書いた所、プログラムが動作しなくなり、とても焦ったのです 全く何やっているのだか 解決に数時間を要しました こんなことだから時間がいくらあっても足りませんね

行きつけのカフェで

本日は土曜日 午前中にカテ二件に参加し、12:30自転車で病院の裏側に向かいました ここは「藤沢市村岡」という地名ですが、とにかく長い上り坂が続きます

頑張って登りきり、いつも遠くから見ていた小高い林の場所まで登りました そこた誰も居ない場所ですが、なかなか良い見晴らしでした

しばし休んでから今度は下り坂を自転車飛ばしました そして 13:00に行きつけの「深沢」にある「栄和堂」というブック・カフェに入りました 頼んだのはコーヒー一杯のみ

そして、MacBook Proを開いて JTVT2019のプログラムに取り掛かりました 色々なことがありなかなか取り組めないでここまで時間が過ぎてしまいました もう本気にならないとやばいのです

しかし、またまた訳の分からないエラーに1.5時間悩まされました それは画面の切り替えにおいて、セッション変数が保持されない、というエラーです 原因は2つ以上ありそうなのですが、やっと一つを潰し、変則手で一つ何とかしました 最初の 1.5時間悩んだエラーの原因は、session_start()を最初に書かなかったからであり、これは僕のミスです

しかし、変則手の方は未だに良く分かりません $_SESSION変数に書き込んこだものの一部しか次のページに引き継がれないのです 今までこんなこと見たことありません ブラウザの問題かと色々なブラウザ試みたのですがどうもそうではありません $_SESSION変数の容量の問題でしょうか? でもそんなに大きなデータをセッションに溜め込んではいません 未だに分かりません原因が

変則手で解決したのは仕方なく $_POSTで渡し、渡されたページでは再度 MySQLを起動してデータをデータベースから読み込むというものです まあこれで動作するので良いと言えば良いのですが・・・

何だかすっきりしませんねえ

JTVT2019現在のデータベース構造

まだまだ refineせねばならないと思いますが、現段階での Database DDLを記録しておきます

 ###############################################################################################
 ### SQL for JTVT2019 
 ### Based on this DDL, the program is constructed.
 ### Programmed by Shigeru SAITO, MD, FACC, FSCAI, FJCC
 ### on March 4th, 2018.
 ### revised on April 12th, 2018
 ###
 ### DB Name : jtvt2019
 ###############################################################################################

CREATE TABLE IF NOT EXISTS `hp_tbls` (
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
  `hp_code` VARCHAR( 11 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `hp_name` VARCHAR( 128 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `zip_code` VARCHAR( 7 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `ken_name` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `hp_address` VARCHAR( 256 )CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `country_code` TINYINT( 2 ) NOT NULL DEFAULT '1',			/* Country Code; By using this code , 1: JAPAN*/
                              /* interface such as feet or lb can be aplied. >10: feet/lb */
  PRIMARY KEY (`id`),
  UNIQUE(`hp_code`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=0;

CREATE TABLE IF NOT EXISTS `dr_tbls` (
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
  `kanji_sirname` VARCHAR( 64 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `kanji_firstname` VARCHAR( 64 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',	
  `english_sirname` VARCHAR( 64 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `english_firstname` VARCHAR( 64 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',	
  `hp_tbl_id` INT( 11 ) NOT NULL DEFAULT '0',
  `hp_name`  VARCHAR( 128 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `job_kind` TINYINT( 2 ) NOT NULL DEFAULT '1',
  `email` VARCHAR( 128 ) NOT NULL DEFAULT '',
  `dr_pwd` VARCHAR( 512 ) NOT NULL DEFAULT '',
  `clue` TINYINT( 1 ) NOT NULL DEFAULT '1',
  `hint` VARCHAR( 512 )NOT NULL DEFAULT '',
  `login_date` DATE NOT NULL DEFAULT '0000-00-00 00:00:00',
  `ip` VARCHAR( 15 ) NOT NULL DEFAULT '000.000.000.000',
  `dr_url` VARCHAR( 60 ) NOT NULL DEFAULT '',
  `is_active` BOOLEAN NOT NULL DEFAULT '0',
  `is_usable` BOOLEAN NOT NULL DEFAULT '1',
  `is_deleted` BOOLEAN NOT NULL DEFAULT '0',
  `created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  UNIQUE(`email`),
  INDEX(`email`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=0;

CREATE TABLE IF NOT EXISTS `login_logs` (
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
  `dr_tbl_id` INT( 11 ) NOT NULL DEFAULT '0',
  `login_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  `login_ip` VARCHAR( 15 ) NOT NULL DEFAULT '000.000.000.000',
  PRIMARY KEY(`id`),
  INDEX(`dr_tbl_id`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=0;

CREATE TABLE IF NOT EXISTS `abstract_tbls` (
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
  `hp_tbl_id` INT( 11 ) NOT NULL DEFAULT '0',
  `dr_tbl_id` INT( 11 ) NOT NULL DEFAULT '0',
  `submission_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  `abstract_topic1` tinyint( 2 ) NOT NULL default '0', /* TAVI, MitraClip, etc  */
  `abstract_topic2` tinyint( 2 ) NOT NULL default '0', /* Complications, etc  */
  `abstract_title` VARCHAR( 200 ) NOT NULL DEFAULT '',
  `abstract_content` VARCHAR( 2000 ) NOT NULL DEFAULT '',
  `is_selected` BOOLEAN NOT NULL DEFAULT '1',
  `is_deleted` BOOLEAN NOT NULL DEFAULT '0',
  `created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  `last_access_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;

CREATE TABLE IF NOT EXISTS `time_slot_tbls` (
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
  `begin_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
    `end_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',	
  PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=0;

CREATE TABLE IF NOT EXISTS `dr_role_tbls` (
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
  `dr_tbl_id` INT( 11 ) NOT NULL DEFAULT '0',
  `time_slot_tbl_id` INT( 11 ) NOT NULL DEFAULT '0',
  `session_tbl_id` INT( 11 ) NOT NULL DEFAULT '0',
  `role_kind` tinyint( 2 ) NOT NULL default '0',
  `is_active` BOOLEAN NOT NULL DEFAULT '0',
  `is_usable` BOOLEAN NOT NULL DEFAULT '1',
  `is_deleted` BOOLEAN NOT NULL DEFAULT '0',
  `created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=0;

CREATE TABLE IF NOT EXISTS `session_tbls` (
    `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
  `session_typing_japanese` VARCHAR( 100 ) NOT NULL DEFAULT '',
  `session_typing_english` VARCHAR( 100 ) NOT NULL DEFAULT '',
    `session_sub_title_japanese` VARCHAR( 100 ) NOT NULL DEFAULT '',
  `session_sub_title_english` VARCHAR( 100 ) NOT NULL DEFAULT '',
  `session_begin_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
    `session_end_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',	
  `session_objective_japanese` VARCHAR( 300 ) NOT NULL DEFAULT '',
  `session_objective_english` VARCHAR( 300 ) NOT NULL DEFAULT '',
  `is_deleted` BOOLEAN NOT NULL DEFAULT '0',
  `created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci AUTO_INCREMENT=0;

 

DCより帰国して

さて水曜日夕方には鎌倉まで戻ってきました ということは、二泊四日のアメリカ行きということになります 今回もインタペ界の世界の錚々たるメンバーと同席し、辛い英語の洪水の中で有意義な討議をしました もちろん僕もそれなりに発言しましたよ

さて、この間色々と演題登録システム構築する中で、不思議な事に気づきました

以前は入力フォームの内容正当性チェックするためには、いちいち JavascritpないしjQueryを用いてプログラムを書かねばなりませんでした

たとえば、email入力に対して、emailとしては明らかにおかしもの 例として saito*shigeru.com などですが、これはサーバーに飛ばす前に frontendて弾いて欲しいですよね

またカラの値が入ってはいけない入力ボックスもありますね そんなのは当然カラで入力されれば弾く必要があります

実際このようなプログラムの塊、それを人は Libraryとか Pluginとか呼ぶのですが、そのようなものは今でもインターネット探すとたくさん無償で公開されています

しかし、時代は急速に変化しつつあるのです、htmlの現在の規格 html5となり、フーォームでの入力に対して required という属性をつけることができるようになったのです 簡単ですね

ところがこれが動作しないことがあることに気づきました それは formの入力ボタンに

<input class=”btn btn-primary” type=”button” value=”Submit” onClick=”submit();”/><などとするとダメなのです

これを

これだとうまく行きます
<input type=”submit” value=”SUBMIT” />

面白いというか気をつけねばなりませんね ちなみに

<button type=”submit”>Submit</button> でも良い気がするのですが、これだと入力ボックスの中で改行できなくなりこれもダメなのですよ ややこしいったらありゃしない

SELECTで選択した列数を PDOで PHPに渡すには

これはしばしば行う間違いなのですが、気が付かないと結構しつこいバグの原因となりますね

$sql = "SELECT COUNT(*) FROM `dr_tbl` WHERE `email` = :email AND `conf_id` = :conf_id;";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":email", $_SESSION['email'], PDO::PARAM_STR);
$stmt->bindValue(":conf_id", $_SESSION['conf_id'], PDO::PARAM_INT);
$stmt->execute();
    //$rowCount = $stmt->rowCount();
    //echo 'Executed!'.$rowCount.'<br>';
if ($stmt->fetchColumn() > 0) {	// 既に登録されているので弾く
        // この時 fetchColumn()が戻す値は SQL文で得られた count(*)ということになります
        // この結果 SELECT文から正しい件数を知ることができます

 

二日間バグで苦しみ

どうにも納得行かなかったのです それは、http://www.tri-international.orgのサイトをサーバー移行した時に始まったのです

そもそもこちらの都合でサーバー移行したのではありません サーバー運営会社の意向に沿って移行したのです これまでずっと使用してきた Rental Serverは FirstServerだったのですが、それが時代の移り変わりと共に、Zenlogicという次世代のサーバー環境になったのです 正直僕はここら Cloudとか詳しくないので何が違うのか良く分かりません

この移行の時に、これまでの全データも移行したのですが、問題は MySQL Database Server Dataだったのです これも移行したのですが、それと共に phpMyadminという MySQLサーバーデータ管理の秀逸のソフトがそのままでは作動しなくなり、改めてインストール必要でした そしてこの時に、port 3307にインストールされたのです これが問題だったのです

そもそも現在はMySQL5.1が port 3307で作動し、MySQL5.0が port 3306で作動している、という変な状況が続いているのです だいたい port番号なんて普段意識せずに使っているのですよっ

そしてサーバー移行前のデータは MySQL5.0から MySQL5.1に自動的にコピーされ、一見すると同じデータが2つの DB serverにあるのです

さて、PHPプログラムでは Internetアクセスした時には、

$db_host = '127.0.0.1';
//$db_port = '3307';//コメントアウトしているので port3306のまま
$db_user = '**A';
$db_password = '**B';

という風に 普段は port 3306の MySQL databaseに接続しているのです しかし管理ソフトの phpMyadminは port 3307で接続していたのです 当初は同じDBがコピーされていたので、phpMyadminでいくらデータをいらっても これは 3307接続ですから、PHP programからはその変更は見えません

結果的にわけのわからないことになってしまったのです この portの問題に気づくまでには丸一日かかりました そして現在は $db_port = ‘3307’; この一文を活かしているので、全てが port 3307で作動している MySQLでプログラム全体が動いているのです

いやあこのバグは判明にずいぶんかかりました しかし、僕の頭脳が未だ明晰であることが証明されてある意味嬉しいですね

PHP scriptでのエラー表示

これまでずっと XAMPPを使用して Web開発してきたのですすが、XAMPPを使っている限り、PHP scriptのエラーは画面にその内容が表示され debugに重宝してきたのです

しかし、MAMPに変更してから、全くエラー表示せず、これはひょっとして設定の問題? と調べると案の定そうでした

現在MAMPでなく MAMP Proを使用しているのですが php.iniは PHPの versionsと同じ数あり、それをいちいち display_erros = Onに設定するのは大変ですし、そのように設定しても必ずしもエラー表示されないのです

これはエラーが本番環境で表示されることは危険なので MAMPの場合 defaultでエラー表示しないようになっているらしいのです

MAMPのPHP設定画面で Log errors: to screenというのをチェックすると PHP versionによってはエラー表示されるようになりました 当面はこれで行きますかね

それでもエラー表示されなければ各PHP fileの先頭で

ini_set('display_errors', 1);

を書き込むことにしましょう 但しこのまま本番環境に uploadすれば本番環境でエラーが表示されるようになり危険です 注意せねばなりませんね

ついに RAP and BEATのトップページに実装

これまでの積み重ねを経て、各種テストを行いました そして ついに RAP and BEATのトップページに登録症例数のグラフ表示を実装できました

動画で表示するようにし、自施設に関しては、赤グラフで表示するようにしました もちろん、ログインが誰により行われ、その人が所属する施設が自施設となります ここで問題だったのは、$_SESSION変数を如何にして Javascriptライブラリである D3.jsに変数として渡すか? でしたが これに関しては少し調べて簡単にできることが分かりました

ここに記載されていたように json_encodeを用いて jsonオブジェクトとして渡すのだそうです これは securityが深く関係しているようです 実際の javascript codeはかくも簡単です

// json_encodeを使用して$_SESSION変数を安全に javascript変数に変換する
    var hp_tbl_id = <?php echo json_encode($_SESSION['hp_tbl_id'], JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); ?>;

この関数の第二引数はオプションであり、security上非常に重要だそうです

こんな馬鹿なことで1週間潰した

さて、今から本格的にプログラム書こうと思っているのが、2019年に学会長を行うように指示されといるとある学会があるのですが、そのいわゆる学会プログラムやその他諸々を handlingするソフトの開発なのです 当然のことながら Smart Phone/Tablet/PCの全てに対応するように “Responsive Web Design”で開発するのです DBは慣れている MySQLを使用し、言語もこれも慣れている PHPを使用します

こんものいちなり書けないのでテスト・プログラムを作成し、local web serverでテスト繰り返すのですが全く作動しないのです

「えーーっ、なんでぇーーー こんな筈は無いはずだあ」と一週間悩んだのです 少しずつ修正しながらテストするのですが全く僕の意図を無視して動作しないのです

まあこんな感じです

// ここれはフロントエンドで SQLに探索語を渡す Ajax通信のルーチン
    $( document ).ready( function () {
      $( "#search_results" ).slideUp();
      $( "#search_term" ).keyup( function ( e ) {
        e.preventDefault();
        ajax_search();
      } );

      function ajax_search() {
        $( "#search_results" ).show();
        var search_val = $( "#search_term" ).val();
        $.post( "dr_role_find_backend.php", {
          search_term: search_val
        }, function ( data ) {
          if ( data.length > 0 ) {
            $( "#search_results" ).html( data );
          }
        } );
      }
    } );

 

そして受け取る方は、PHPとMySQLです

 session_start();
 session_regenerate_id(true);
 require_once('../utilities/config.php');
 require_once('../utilities/lib.php');	
 charSetUTF8();
 //接続
	try {
   // MySQLサーバへ接続
  	$pdo = new PDO("mysql:host=$db_host;dbname=$db_name_sessions;charset=utf8", $db_user, $db_password);
 // 注意: 不要なspaceを挿入すると' $db_host'のようにみなされ、エラーとなる
 } catch(PDOException $e){
   		die($e-&gt;getMessage());
 }

 $hp_name = strip_tags(trimBothEndSpace(mb_substr($_POST['search_term'], 0, 100)));	// 前後のspaceなど削除し、文字数を100文字に制限する
 $hp_name = strtoupper(mb_convert_kana($hp_name, 'ashK'));		// 半角英字大文字に変換する

 $stmt = $pdo-&gt;prepare("SELECT * FROM `hp_tbls` WHERE `hp_name` LIKE :hp_name ORDER BY `hp_name` ASC;");
 $stmt-&gt;bindValue(":hp_name", '%'.$hp_name.'%', PDO::PARAM_STR);
 $flag = $stmt-&gt;execute();
 $rows = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);
 
 if (!$flag) {
   		$infor = $stmt-&gt;errorInfo();
     exit($infor[2]);
 }

 

これで、検索語として病院名の一部を入力すれば、DBより検索してくれる筈なのです

しかし、しかし動作しない 本当にこの解決に一週間かかり、先程やっと解決しました

色々な問題があったのです まずは

trimBothEndSpace(mb_substr($_POST['search_term'], 0, 100))

という関数ですが、(1) mb_substrの引数を何時の間にか消去してました つぎに(2) trimBothEndSpaceという関数ですが、これは自作関数なのですが、それをlib.phpに作成してあり(ある筈)、それを読み込んで使用するのですが、何と lib.phpの中にこの関数を書いていなかったのです

この2つのバグのために、phpそのものが走らず結果的に echoで途中経過を出そうと思っても出せない そんな事態に陥っていたのです 本当に大変なバグ退治でした これも Ajax通信によるプログラムだからのことです 本当に非同期通信というのは難しいです これが解決してうまく動作しているデモ画面です

うまく Ajax通信が動作しているところ