オンライン肥料教室を開催しています
検索キーワード:「execute」
 

php-webdriverでAceのコードエディタに文字を入力する

/** Geminiが自動生成した概要 **/
`executeScript`は、ChromeDriverでJavaScriptを実行するメソッドです。第一引数に実行するスクリプト、第二引数にオプションの引数配列を取ります。このメソッドは、ブラウザコンテキストでJavaScriptを実行し、その結果を返します。Aceエディタへの入力は、エディタオブジェクトの`setValue`メソッドをJavaScript経由で呼び出すことで実現できます。上記例では、`$script`に`setValue`呼び出しを定義し、`$html`をエディタに設定しています。`executeScript`の第二引数配列は、`$script`内の`arguments`オブジェクトにマッピングされます。これにより、PHPからJavaScript関数をパラメータ付きで実行できます。

 

SQLインジェクションに対してプリペアードステートメントが有効であるかを試してみる

/** Geminiが自動生成した概要 **/
この記事では、PHPにおけるSQLインジェクション対策としてプリペアードステートメントの有効性を検証しています。まず、脆弱なコード例を示し、攻撃者がSQL文を操作して意図しないデータを取得できることを実演。次に、プリペアードステートメントを用いた修正版を紹介し、SQL文と入力データを分離することで攻撃を防ぐ仕組みを解説しています。具体的には、プレースホルダを用いてSQL文を準備し、executeメソッドでパラメータをバインドすることで、入力データがSQL文として解釈されることを防いでいます。結果、同じ攻撃を試みてもデータが取得できず、プリペアードステートメントの有効性が確認されました。関連記事として、SOY2DAOでのプリペアードステートメントの利用方法も紹介されています。

 

php-webdriverでcontent-visibility:auto;を利用しているページのリンクをクリックする

/** Geminiが自動生成した概要 **/
php-webdriverで`content-visibility:auto;`を使用したサイトのリンクをクリックする際、遅延読み込みにより要素が見つからない問題が発生する。`getLocationOnScreenOnceScrolledIntoView()`だけでは不十分で、一度スクロール後にページトップに戻り、再度徐々にスクロールすることで要素を確実に表示させクリックを成功させる方法を紹介。これはページ表示速度の高速化と遅延読み込みによる影響への対策。また、SeleniumによるアクセスをGoogle Analyticsから除外する方法についても言及し、誤った計測を防ぐための設定についても触れている。さらに、関連するelement click interceptedエラーへの対処法の記事へのリンクも提供。

 

PHPのオブジェクトの継承の負荷を見る

/** Geminiが自動生成した概要 **/
PHPでクラス継承時のメモリ使用量を検証した。継承の有無にかかわらず、インスタンス作成によるメモリ増加量は同じだった。VLDを用いて継承時のメソッドを確認すると、子クラスは親クラスのメソッドを保持し、オーバーライドも可能であることが分かった。つまり、インスタンス生成時はオブジェクトとプロパティ値のみを保持し、メソッドはクラス定義に基づいて解決される。継承はメソッドの探索順序に影響するが、インスタンスのメモリ使用量には直接影響しない。

 

PHPでforeach文の抜け方を見る

/** Geminiが自動生成した概要 **/
PHPのforeach文でループ中にreturnで抜ける場合、メモリリークの懸念がある。VLDでforeachのオペコードを見ると、ループ終了時にFE_FREEで変数を解放している。しかし、ループ中のreturnでもFE_FREEが実行されるか検証した結果、return前にFE_FREEが挿入されていた。つまり、foreach中にreturnしてもメモリリークは発生せず、PHPが適切にメモリ管理を行っていることが確認できた。

 

PHPのVLDで無名関数を見る

/** Geminiが自動生成した概要 **/
PHPのVLDを使って無名関数のオペコードを確認した。無名関数は変数`$isEven`に格納され、if文で実行される。VLD出力では、通常の関数と異なり、function nameが`{closure}`と表示された。これはクロージャを示す。無名関数は関数自体を変数に格納し、後で実行できる。

 

PHPのVLDで関数を見る

/** Geminiが自動生成した概要 **/
PHP関数`isEven`のVLDによるオペコード解析結果を検証。`isEven(2)`呼び出しを含むコードでは、メイン部分と`isEven`関数のオペコードが別々に生成され、関数の定義位置に関わらず、実行時のオペコードでは呼び出し部分が先に現れる。定義位置による実行速度への影響は検証予定だが、計測方法未定のため保留。

 

PHPのVLDでforとforeachを比較する

/** Geminiが自動生成した概要 **/
OPcacheは、PHPスクリプトをコンパイルしたオペコードを共有メモリにキャッシュすることで、PHPのパフォーマンスを向上させる強力なツールです。スクリプトがリクエストされるたびにコンパイルする必要がなくなり、ファイルシステムへのアクセスが削減されます。OPcacheは、PHP 5.5.0以降でデフォルトで有効になっています。 `opcache.enable`ディレクティブで有効化し、`opcache.revalidate_freq` でキャッシュの有効期限を設定します。`opcache_reset()`関数でキャッシュを手動でクリアすることも可能です。OPcacheは、Webサーバーのパフォーマンスを大幅に向上させるため、PHPアプリケーションには必須のツールです。

 

PHPのVLDでfor文を見る2

/** Geminiが自動生成した概要 **/
PHPのfor文で、条件式に`count($arr)`を直接記述するパフォーマンスへの影響を検証。VLDでオペコードを確認すると、ループごとに`count`が実行されていることが判明。しかし、`$cnt = count($arr)`として変数に代入してからループ条件に用いるコードと実行時間を比較した結果、有意な差は見られなかった。ループごとに`count`が実行されるのは非効率と考えられるが、`count`関数自体の実行コストは低い、またはPHPの最適化によって`count`の実行回数が減っている可能性がある。

 

PHPのVLDでfor文を見る

/** Geminiが自動生成した概要 **/
PHPの`for`ループでインクリメント演算子`$i++`と`++$i`の速度差を検証。`++$i`の方が高速で、1億回のループで処理時間が約3/5に短縮された。VLDでオペコードを比較すると、`$i++`では`POST_INC`と`FREE`の2つのオペコードが使われるのに対し、`++$i`では`PRE_INC`のみ。`$i++`は値を一時的に保存するためメモリ確保と解放が必要になり、`++$i`は直接インクリメントするためオーバーヘッドが少ない。結果として`++$i`の方が高速になる。`for`ループでは`++$i`の使用が推奨される。

 

VLDでPHPのオペコードを確認する

/** Geminiが自動生成した概要 **/
PHPの深層理解のため、オペコードを確認する方法を解説。VLD(Vulcan Logic Dumper)を用いて、PHPコードを中間コードに変換する様子を観察できる。Ubuntu 20.04、PHP 7.4.6環境で、vldをgit clone、phpize、configure、make、installし、php.iniにvld.soを追加。`php -d vld.active=1 -d vld.execute=0 /path/to/dir/a.php`で"Hello World"のオペコードを確認できる。これによりPHP内部の仕組みを理解する第一歩となる。

 

郵便番号を入力したら半径3km内のすべての町名を取得する

/** Geminiが自動生成した概要 **/
Google Geocoding APIを用いて、指定住所(安岡寺)から半径3km以内の町名を取得する方法を検証した。APIで中心座標を取得後、緯度経度を0.01(約1km)ずつずらした地点の逆ジオコーディングを繰り返し、町名を収集した。しかし、1kmグリッドでは範囲内の全町名を網羅できず、グリッドを細かくするとAPI使用回数が増加する問題点が残った。より効率的な方法の検討が必要。

 

【SEO対策】最終産物のHTMLのキャッシュで高速化

/** Geminiが自動生成した概要 **/
SQLiteを採用するSOY CMSでサイト表示を高速化するため、最終生成HTMLのキャッシュ化機能を導入した。データベースやファイル読み込みを省略することでPageSpeed Insightsのスコアが大幅に向上。この機能はHTMLキャッシュプラグインをインストール後、index.php内のexecute_site()をexecute_site_static_cache()に変更することで有効になる。ただし、カート内容の表示など動的なコンテンツはキャッシュ化できないため、リッチなサイト構成との両立は難しい。高速化とSEO対策には見栄えよりも内容重視の割り切りが必要となる。SOY Shopでも同様のキャッシュプラグインが開発されている。

 

SOY CMSのキャッシュモードで表示の高速化

/** Geminiが自動生成した概要 **/
SOY CMSのブログでデータベースをMySQLからSQLiteに変更することで、パフォーマンス向上とデータ管理の簡素化が期待できます。特に共有サーバーなど、MySQLのチューニングが難しい環境では効果的です。変更手順は、まずphpMyAdmin等でMySQLのデータをエクスポートし、SQLite形式に変換します。次に、SOY CMSの設定ファイルでデータベース接続設定をSQLiteに変更し、変換したデータをインポートします。記事データが多い場合、変換とインポートに時間がかかるため、夜間などアクセスが少ない時間帯に行うのがおすすめです。また、SQLiteはMySQLと比べて同時アクセス性能が劣るため、高トラフィックのサイトには不向きです。変更前にデータベースのサイズやアクセス状況を確認し、SQLiteのメリット・デメリットを理解した上で検討することが重要です。

 

SOY CMSを介さずにSOY2DAOを使ってみる2

/** Geminiが自動生成した概要 **/
SOY CMSを使わずにSOY2DAOでSQLを実行し、オブジェクトで結果を取得する方法を解説しています。 独自SQLの実行には`executeQuery()`ではなく`executeObjectQuery()`を使用します。`executeObjectQuery()`の第一引数にSQL文、第二引数にDAOクラス名を指定します。戻り値は指定したクラスのオブジェクト、もしくはオブジェクトの配列となります。記事では、`SOY2Sample`クラスと対応するテーブル`soy2_sample`を例に、`id`と`text`を取得するSQLを実行し、結果を`SOY2Sample`オブジェクトの配列として受け取る方法をコード付きで示しています。これにより、データベースから取得したデータをオブジェクトとして扱いやすくなります。

 

SOY CMSを介さずにSOY2DAOを使ってみる1

/** Geminiが自動生成した概要 **/
SOY CMSを使わずにSOY2DAOを単体で利用する方法を紹介。SQLiteのインメモリデータベースを例に、テーブル作成、データ挿入、検索のコードを記述。WEBAPP_DIRの定義、SOY2のinclude、RootDir設定、SOY2DAOConfigによるDSN設定を行い、SOY2DAOでSQLを実行。結果として、挿入したデータが期待通りに取得できることを確認。次回はDAO本来の機能を探る。

 

SOY2HTMLで条件によって非表示にする - HTMLModel編

/** Geminiが自動生成した概要 **/
SOY2HTMLのHTMLModelは、条件付き出力制御を可能にする。HTMLの一部をHTMLModelで囲み、visible属性に条件式を指定することで、条件を満たした場合のみその部分がレンダリングされる。例として、ブログ記事の「続きを読む」リンクは、追記がある場合のみ表示したい場合に利用できる。HTMLModelは、単に出力の有無だけでなく、外部CSSパスの動的な制御など複雑な処理も可能だが、基本的な使い方はシンプルで、visible属性による表示制御が便利である。HTMLModel自体は何もせず、親クラスであるSOY2HTMLの挙動を理解する必要がある。

 

SOY2HTMLでリンクを出力する - HTMLLink編

/** Geminiが自動生成した概要 **/
SOY2HTMLのHTMLLinkクラスは、PHPでリンクを生成するためのクラスです。`text`属性でリンクテキストを、`link`属性でhref値を設定します。`SOY2PageController::createLink()`を使うと、管理画面のURLを簡単に生成できます。HTMLには`<a soy:id="detail_link"></a>`と記述します。HTMLActionLinkクラスはHTMLLinkを継承し、URLにトークンを付与することでセキュリティを強化します。`soy2_check_token`と併用し、URL直打ちを防止します。

 

SOY2HTMLで繰り返し表示 - HTMLList編

/** Geminiが自動生成した概要 **/
SOY CMSのブロック内で繰り返し表示される記事に、一定の間隔で任意の文字列を表示するには、下記の手順に従います。 1. HTMLListクラスを継承したPHPクラスを作成し、populateItemメソッドで表示したい内容をHTMLタグで記述します。 2. HTMLファイルで、populateItemメソッドで作成したHTMLタグをsoy:idを使用して囲みます。 3. 表示する間隔をsoy:id="loop"に指定します。 4. 表示する文字列をsoy:id="index"に指定します。 これで、指定した間隔で任意の文字列が繰り返し表示されます。

 

SOY2HTMLでセレクトボックスを設置する - HTMLSelect編

/** Geminiが自動生成した概要 **/
SOY2HTMLのHTMLSelectクラスは、HTMLのセレクトボックスを生成する。`$this->addSelect()`で利用し、オプションは第二引数の配列で指定する。 `options`キーに配列を渡すとoptionタグが生成され、連想配列でない場合はvalue属性が設定されない。`indexOrder`をtrueにすると、数値インデックスがvalue属性となる。`selected`キーで選択状態を指定、複数選択には配列で渡す。多重配列でoptgroupも作成可能。`each`キーで各optionタグに属性を追加できる。

 

SOY2HTMLでラジオボタンやチェックボックスを設置する - HTMLCheckBox編

/** Geminiが自動生成した概要 **/
SOY2HTMLでラジオボタンとチェックボックスを設置する方法を解説。HTMLCheckBoxクラスを用い、PHP側で`addCheckBox`メソッドを使い、HTML側で`<input type="(radio|checkbox)" soy:id="id名">`を記述する。`addCheckBox`の第二引数配列には、name, value, selected(チェック状態), label(ラベルテキスト)を指定する。ラジオボタンはnameを共通にすることでグループ化される。チェックボックスは単独で動作する。HTMLCheckBoxクラスはHTMLInputを継承し、labelタグを自動生成する機能を持つ。`isBoolean`をtrueに設定すると、値が未送信の場合に備えてhiddenで値0を送信する。

 

SOY2HTMLでテキストエリアを設置する - HTMLTextArea編

/** Geminiが自動生成した概要 **/
HTMLTextAreaクラスは、テキストエリア要素を生成します。name属性とテキストの内容を指定し、その内容をinnerTextとしてレンダリングします。getTextメソッドはテキストの内容を取得し、オブジェクトを取得するオブジェクトメソッドはHTMLエスケープされたテキストを改行で囲んで返します。

 

SOY2HTMLでテキストフォームを設置する - HTMLInput編

/** Geminiが自動生成した概要 **/
SOY2HTMLを使用してテキストフォームを作成する方法を説明します。`HTMLInput`クラスを利用して、フォームにテキストフォームを追加できます。`addInput()`メソッドを使用して、フォーム要素のnameとvalue属性を設定します。これにより、PHPの記述混入を回避しつつ、デザインを崩さずにHTMLファイルを直接表示できます。テキストフォームの実際のコードは、`HTMLFormElement`クラスを継承した`HTMLInput`クラスで定義されています。

 

SOY2HTMLでセキュアなフォームを設置する - HTMLForm編

/** Geminiが自動生成した概要 **/
HTMLFormクラスは、HTMLのフォーム要素を生成するためのコンポーネントです。formタグを生成し、メソッド(デフォルトはPOST)やアクション、ターゲットなどの属性を設定できます。POSTメソッドの場合、CSRF対策としてsoy2_tokenという隠しフィールドを自動的に追加します。アクションが指定されていない場合は、現在のリクエストURIがアクションとして設定されます。また、JavaScriptのonSubmitイベントを設定することも可能です。disabled属性の設定も可能です。

 

プラグイン毎に詳細画面を持たせる拡張ポイントsoyshop.config.php

/** Geminiが自動生成した概要 **/
SOY Shopプラグインの拡張ポイントsoyshop.config.phpは、プラグイン毎に詳細設定画面を作成するための機能です。プラグインディレクトリにsoyshop.config.phpを設置し、インターフェース`SOYShopConfigPageBase`を実装することで、`http://ドメイン/CMSインストールディレクトリ/soyshop/index.php/Config/Detail?plugin=プラグインID` でアクセス可能な設定ページが生成されます。 主要なメソッドは`getConfigPage()`(設定画面のHTMLを出力)、`getConfigPageTitle()`(設定画面のタイトル)、`redirect()`(リダイレクト)です。`getConfigPage()`では、SOY2HTMLを用いてHTMLを生成するのが一般的です。PAY.JPクレジットカード支払いモジュールでは、`PayJpConfigPage`クラスとテンプレートファイルを使用して設定画面を構築しています。`redirect()`メソッドは、設定更新後などにURLパラメータを追加してリダイレクトする際に使用します。

 

SOY2HTMLでsoy:idを作る - HTMLLabel編

/** Geminiが自動生成した概要 **/
SOY2HTMLでPHPの処理結果をHTMLに表示するには、`soy:id`を利用します。PHP側では`addLabel`メソッドを使い、`soy:id`と同じ名前を第一引数、表示する値を`text`か`html`プロパティに設定した配列を第二引数に渡します。`text`は文字列をエンコードし、`html`はHTMLタグをそのまま出力します。`addLabel`は`createAdd`メソッドの簡略形で、本来は第二引数に`HTMLLabel`クラスを指定します。`soy2prefix`を指定すれば`soy:`部分を変更できます。

 

SOY2HTMLで処理とデザインを切り分ける

/** Geminiが自動生成した概要 **/
SOY2HTMLFactoryは、SOY CMSでPHPによる処理とHTMLによるデザインを完全に分離するための仕組みです。拡張ポイント(例: `soyshop.admin.top.php`)の`getContent`メソッド内で使用され、`SOY2::import`で読み込んだPHPクラスを`SOY2HTMLFactory::createInstance`でインスタンス化します。このPHPクラスがビジネスロジックを担当し、同名のHTMLファイルをテンプレートとして利用。`soy:id`を通じて両者を連携させ、動的なコンテンツを生成・表示します。これにより、プログラマとデザイナの役割分担を明確にし、開発効率向上に貢献します。

 

SOY Shopの管理画面の注文一覧ページで表示速度周りを改修しています

/** Geminiが自動生成した概要 **/
SOY Shopの管理画面、特に注文一覧ページの表示速度改善に取り組んでいます。月商数千万円規模のショップで顕著になる速度低下の原因となっていた、顧客名表示等の処理をDAO経由からSQL直書きに変更。顧客情報全体を取得する代わりに必要な名前だけをデータベースから取得することで、処理を効率化しました。他にも例外処理の見直しやテストコードによるエラー修正を行い、体感できる速度改善を実現。今後も処理速度の改善を継続し、最新版はサイトからダウンロード可能です。

 

Ubuntu版BracketsのBeautifyの設定

/** Geminiが自動生成した概要 **/
BracketsエディタのプラグインBeautifyでPHPファイル保存時の自動改行を停止しようと試みたが、設定変更は断念。PHPの終了タグ`?>`の後の改行が不要だったのが理由。しかし、最近のPHPコード規約では、PHPのみのファイルでは終了タグ自体が不要と知り、全ファイルから`?>`を削除することに。結果として、Bracketsの自動改行挿入設定は変更せずそのままとした。

 

SOY Shopの商品詳細ページで登録されている商品をランダムで表示する

/** Geminiが自動生成した概要 **/
SOY Shopの商品詳細ページで登録商品をランダム表示するPHPモジュールを作成する方法です。まず、管理画面でモジュールID「item.random」のPHPモジュールを作成し、指定のコードを記述します。このコードはSOY2DAOを使い、全商品、または指定カテゴリの商品をランダムに取得し、表示件数を制限するSQLを実行します。商品詳細ページテンプレートに`<!-- shop:module="item.random" -->`と`<!-- block:id="random_item_list" -->`を記述することで、ランダムに選ばれた商品が表示されます。カテゴリを指定するには、`$categoryId`変数にカテゴリIDを代入します。

 

SOY2DAOでトランザクションを利用する

/** Geminiが自動生成した概要 **/
SOY2DAOではトランザクション処理が可能です。トランザクションを使用することで、複数のSQL文をまとめて実行し、処理に失敗した場合に一連の変更をすべて取り消すことができます。 トランザクションを開始するにはbegin()メソッドを使用し、終了するにはcommit()メソッドを使用します。処理中にエラーが発生した場合は、successedフラグをfalseに設定し、処理をロールバックします。 これにより、複数の処理が確実に実行されることが保証され、データの一貫性が維持されます。

 

SOY2DAOでSQLを実行して、オブジェクトで返す

/** Geminiが自動生成した概要 **/
SOY2DAOで複雑なSQLを実行しつつ、結果をオブジェクトで取得する方法が紹介されています。顧客テーブルとカスタムフィールドテーブルを結合し、特定のカスタムフィールド値を持つ顧客情報を取得する例が示されています。 `SOYShop_UserDAO` の `executeQuery` でSQLを実行し、結果の配列をループ処理で `getObject` メソッドに渡すことで、各レコードが `SOYShop_User` オブジェクトに変換されます。これにより、カスタムフィールドの値で検索しながら、必要な顧客情報のみをオブジェクトとして扱いやすく取得できます。この手法は、以前紹介されたSOY CMSの検索フォーム追加の記事でも活用されています。

 

SOY2DAOでデータベースから値を取り出す

/** Geminiが自動生成した概要 **/
SOY2DAOを用いたデータベースからの値の取得方法を解説。プリペアードステートメントに続き、今回はDAOの機能を活用した取得方法を紹介。SOY Shopの顧客情報を例に、`SOY2DAOFactory::create("user.SOYShop_UserDAO")` でDAOオブジェクトを生成し、`$userDao->get()` でデータを取得する様子をコードで示す。取得したデータはSOYShop_Userオブジェクトの配列となり、`$user->getName()` のようにゲッターメソッドで簡単に値にアクセスできる。SQL直接実行の場合と比べ、オブジェクト指向の恩恵で可読性・安全性が向上する点を強調。最後に、SQL実行結果もオブジェクトで扱いたいケースへの言及で締めくくっている。

 

SOY2DAOでプリペアードステートメントを利用する

/** Geminiが自動生成した概要 **/
SOY2DAOでプリペアードステートメントを使う方法を解説します。SQLインジェクション対策として、SQL内に直接値を埋め込むのではなく、プレースホルダ(:name)を使用します。 例: $sql = "SELECT * FROM soyshop_user WHERE mail_address = :mail AND password = :pass"; $binds = array(":mail" => $m, ":pass" => $p); $results = $dao->executeQuery($sql, $binds); executeQueryの第二引数にプレースホルダと値の連想配列を渡すことで、SOY2DAOが安全にSQLを実行します。これにより、$mや$pにSQL構文が挿入されても、悪意のあるクエリの実行を防ぎます。

 

SOY CMS/Shopのモジュール内でSQLを実行する

/** Geminiが自動生成した概要 **/
SOY CMS/Shopのモジュールでは、PHPで自由にSQLを実行できる。PDOは結果の整形が面倒だが、SOY2DAOクラスを使うと便利。 例えば、`soyshop_user`テーブルから上位5件を取得するSQLを、PDOで実行すると連想配列と数値添字配列の混合配列が返り使いにくい。SOY2DAOの`executeQuery`メソッドを使うと、同じSQLでも整形された連想配列として結果が返るため、foreach文などを書かずに扱える。

 

CMSに不正にログインした後、何をする?

/** Geminiが自動生成した概要 **/
SOY CMSに不正ログイン後、ファイルマネージャからのPHPアップロードは不可だが、フロントコントローラ(index.php)に悪意あるPHPコードを埋め込み可能。これにより、サイト閲覧時に勝手にメール送信などの踏み台攻撃が可能になる。対策はindex.phpの書き込み権限を外すこと。SOY ShopのテンプレートやPHPモジュールも悪用されうる。

 

SOY CMSのブロックで記事のランダム表示

/** Geminiが自動生成した概要 **/
SOY CMSのブロックで記事をランダム表示するスクリプトモジュールブロックのコードが紹介されています。指定したラベルの記事をランダムに並び替え、指定件数分出力します。 `/site(サイトID)/script/soycms_random.php` にPHPコードを記述し、テンプレートで `cms:label` にラベルID、`cms:count` に取得件数を指定することで利用できます。コードはフォーラムにもアップロードされています。記事の取得件数を指定しない場合は、該当ラベルのすべての記事を取得しランダムに表示します。

 

Golangのsessionの取り扱いの際の型で苦戦した

/** Geminiが自動生成した概要 **/
Go言語でgorilla/sessionsを使ってセッションを扱う際、セッションから取得した値の型がinterface{}となり、string型の構造体フィールドに代入できない問題が発生した。ログ出力ではstring型に見えたが、構造体への代入時に型エラーが発生。stringへの型アサーションを試みても解決せず、最終的に構造体のフィールド型をinterface{}に変更することで回避した。セッション値取得時の動的な型定義と構造体の静的な型チェックの不一致が原因と考えられる。より良い解決策を模索中。

 

PHPで簡易的なクローラを作ってみた

/** Geminiが自動生成した概要 **/
PHPで簡易クローラーを作成し、`file_get_contents()`でサイトのHTMLを取得、特定文字列の有無を調べた。再帰的にページ内のリンクを辿り、同一ドメインのURLを解析するが、既に解析済みのURLはスキップする。`scrape()`関数でHTML解析を行う予定。問題点として、ページ数が多いと記録用配列が肥大化し、対象サーバーへの負荷も高くなることが判明。スラッシュ始まりのURL取得にも未対応。それでも`file_get_contents()`の便利さを実感した。

 

SOY CMSで複数のブログ記事をまとめて検索できる機能を作ってみた

/** Geminiが自動生成した概要 **/
SOY CMSで複数のブログ記事をまとめて検索する機能を作成。従来のスクリプトモジュールブロックでは、記事取得後にブログ判別ができず適切なURLを出力できなかったため、cms:moduleを利用。SQLでラベルIDを指定して2つのブログから記事を取得し、取得結果からラベルIDに応じてURLを生成、出力することで複数ブログ検索を実現。モジュールではSQL実行結果を直接利用できるため、Entryオブジェクトへの変換が不要で、柔軟なURL生成が可能となった。

 

検索フォームと検索結果ページを作ってみた3

/** Geminiが自動生成した概要 **/
SOY CMSで検索機能を実装する方法を解説。`/site(サイトID)/script/soycms_search.php`に検索スクリプトを記述。SQLで記事タイトル、本文、追記フィールドを検索し、公開期間内の記事を抽出。結果はEntryオブジェクトに変換後、配列`$soycms_search_result`に格納。テンプレートには`<form method="get" action="/search">`で検索フォームを設置し、クエリパラメータ`q`で検索文字列を受け取るようにする。`$dao->getObject($row)`で検索結果をEntryオブジェクトに変換することで、テンプレートに記述した`<!-- block:id="result" -->`で表示可能になる。

おすすめの検索キーワード
おすすめの記事

Powered by SOY CMS   ↑トップへ