2

データベースにバイナリ データを挿入する CakePHP 2.x (2.1.5、2.2.7) に実際の問題があります。

私の問題は、未加工のバイナリ データをデータベースに挿入すると、次のエラーが発生することです。

エラー: SQLSTATE[HY093]: 無効なパラメーター番号: 名前付きパラメーターと位置パラメーターが混在しています

私の挿入コードは次のようになります。

        $imageData = array(
            $this->alias => array(
                'parent_id' => $imageId,
                'image' => $imageBlob,
                'encoding' => $encoding,
                'mime_type' => $mime_type,
                'file_name' => $options['fileDetails']['name'],
                'width' => $imageWidth,
                'height' => $imageHeight,
                'size_type' => $resizeName,
                'owner_class' => $options['ownerClass'],
                'token' => $this->generateToken()
            )
        );

        $this->create();
        $this->save($imageData);

挿入前に imageBlob データを base64 エンコードすると、挿入は正常に機能します。CakePHP 1.3 の同様のコードは、最初にデータを base64 エンコードする必要なく、正常に機能しました。MySQL の列は MEDIUMBLOB です。

Cake ライブラリを使用してコードのトレースを開始し、列の型が「バイナリ」として正しく推測され、実行が「バイナリ」ケースを実行していることを確認しました。

        switch ($column) {
        case 'binary':
            return $this->_connection->quote($data, PDO::PARAM_LOB);

また、Cake が実際には名前付きパラメーターで通常の PDO 構文を使用せず、非常に長い SQL 文字列を作成するだけであることにも非常に驚いています。

バイナリ データの挿入に関する問題は、PHP 5.2.6 または MySQL 5.0.45 で実行しているためでしょうか? (両方ともかなり古いバージョン)。

4

2 に答える 2

2

これは、PHP 5.2.6 の PDO システムの制限のようです。詳細については、このバグを参照してください: https://bugs.php.net/bug.php?id=44251

どうやらこれは PHP 5.2.8 で修正されているようです。そのため、CakePHP の要件では、互換性のある PHP の最小バージョンは 5.2.8 であるとされています。

したがって、解決策は、データを Base64 にするか、PHP 5.2.8 にアップグレードすることです。

これが他の誰かに役立つことを願っています。

于 2013-03-20T00:45:03.643 に答える
1

PHP 5.2.6 と MySQL 5.0.45-7 でまったく同じ問題が発生しています。この問題は、同じコード ベースと CakePHP 2.1.5 を使用する 5.4.4 と MySQL 5.5.25 では発生しません。

スタック トレースと SQL 挿入ステートメントを見ると、バイナリ データに一重引用符が含まれています。これは、エラー メッセージに示されているように、列名/値のカウントをスローしているクエリの一部であると確信しています。

私が思いついた唯一の解決策は、データベースに挿入する前にバイナリ ファイル データを base64 でエンコードすることでした (もちろん、それを返すときに base64 でデコードします)。より良い解決策があるかどうかに興味があります。

于 2013-03-13T01:27:52.707 に答える