一畳のくつろぎタイム

このブログでは紹介する商品画像をAmazonアソシエイトより借りています。画像やリンクにはアフィリエイト広告が含まれる事があります
ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

2023年7月29日土曜日

foreachの書き方に見える初心者PHPプログラマーのよくないところ

phpは色々便利関数が用意されており、「そんな気が利いた関数があるの?」となることがよくあります。
とても便利な言語だと思いますが、スクリプト言語ゆえによくないコードも知らずに書いてしまう恐れがあります。

繰り返し処理をプログラミングするにあたり、初回や最後だけ特別な処理したいケースがあります。繰り返し文の外へ出してしまえば簡単に解決するケースもありますが、どうしても繰り返し文のなかでやりたい場合もあります。

「php foreach 最後」や「php foreach 最初」というキーワードでGoogle検索すると

以下のようなコードを掲載したサイトがたくさんでてきます。

$array = array(1, 2, 3, 4, 5);
foreach ($array as $value) {
    if ($value === reset($array)) {
        // 最初
    }
    if ($value === end($array)) {
        // 最後
    }
}

動作確認をとったところ期待したように動くコードではあるようですが、このコードは私にはいろいろ気持ち悪さと疑問が浮かぶコードです。 そのまま採用してはいけません。

2022年8月9日火曜日

HTML_QuickForm2のドはまり

 PHPのサンプルプログラムを作成しまして、バリデーターのHTML_QuickForm2を使ったのですが、バリデート後の値を取得するメソッド

$form->getValue()

で得られる連想配列が空っぽで値がありません。 ($formがHTML_QuickForm2のインスタンスとして)

$_POSTには値があるのにgetValue()では取得できない。3時間ぐらい調査して原因は1行の書き忘れだった。

2019年2月25日月曜日

Googleアシスタントアプリのメディアファイル置き場を0円で解決する

Googleアシスタント公式できることの、最新のサービスの所の下の方に出てるので探してみて!


Googleアシスタントアプリのしずくクロックを作るにあたって、プログラム実行部分はFirebaseではなく自前で用意した。アシスタントアプリはJSONテキストを戻りとするが、 声のデータ(oggファイルやmp3ファイル)はHTMLなどで画像を参照するのと同等で、URLの記述をし、アシスタント側(HOMEやスマホ)がJSONの結果をもとに取得に行く。
はじめは同じサーバーから取得させていたが、この静的データは同じWebサーバーにおいてある必要はない。

メディアを提供するWebサーバー側には要件はあって
*SSLに対応している事

おそらくこれのみだと思う。

2018年4月24日火曜日

ComposerでPEAR

PEARのライブラリcache_liteをComposerでインストールしたかったがうまくいかなかった。
configでHTTP接続を許可し、pearの取得先をrepositoriesで指定。
pear-pear.php.netの指定で
こちらのサイトで
pearのライブラリの名前とバージョンを調べて追記してupdateしたらうまくいった。

composer.json
{    
    "name": "vendor/myapp",
    "description": "プロジェクトの説明。",
    "authors": [
        {
            "name": "myname",
            "email": "your@email.here"
        }
    ],
    
    "config": {
        "secure-http": false
    },
    
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear.php.net/"
        }
    ],
    
    "require": {
        "smarty/smarty": "~3.1",
        "pear-pear.php.net/cache_lite": "1.8.2"
    }
}
Composer2だとpearは取れないっぽいです。

PDOで表の名前にはプレースホルダーが使えない

ダメなコード

    // PDOによる接続
    $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8','test','password');
    // DBエラーで例外を発生させる
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // プリペアステートメントのエスケープ設定
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    
    $stmh = $pdo->prepare("select * from :table");
    
    $stmh->bindValue(":table", "mytable");
    
    $stmh->execute();

show tableを実行して得た結果からテーブルを選ばせてその情報を取得しようとしたがSyntaxエラーとなる。

FROM句にプレースホルダーを使うことは少ないが、これはできないらしい。
自分で無害化するか、表名自体を表に出さないような作りにする必要がある。

参考
https://stackoverflow.com/questions/15182910/php-pdo-bind-table-name