2

私はクラスを持っています:

class Media {
    private $media;
    private $thumb;
    private $slug;
    private $info;
    private $type;
    private $link;
}

そして、PHPPDOを使用してDBに保存しようとします。

$PDO = new PDO("mysql:host=".DBHOST.";dbname=".DB, DBUSER, DBPASS);

$options = array('media' => 'image.jpg',
            'thumb' => 'image_thumb.jpg');
$media = new Media($options);

$media = (array)$media;

$STH = $PDO->prepare('INSERT INTO media (media, thumb, slug, info, type, link) values (?, ?, ?, ?, ?, ? )');

$STH->bindParam(1, $media['Mediamedia']);
$STH->bindParam(2, $media['Mediaslug']);
$STH->bindParam(3, serialize($media['Mediainfo']));  //line 150
$STH->bindParam(4, $media['Mediathumb']);
$STH->bindParam(5, $media['Mediatype']);
$STH->bindParam(6, $media['Medialink']);

$STH->execute();

上記のコードは1つのエラーを生成します:

注意:未定義のインデックス:150行目のC:\ wamp32 \ www \ MM\index.phpのMediainfo

しかし、print_r($media);出力:

Array
(
    [Mediamedia] => image.jpg
    [Mediathumb] => image_thumb.jpg
    [Mediaslug] => image
    [Mediainfo] => Array
    (
        [title] => image.jpg
        [alt] => image.jpg
        [description] => image.jpg
    )
    [Mediatype] => .jpg
    [Medialink] => 0
)

編集:@dleiftahが言ったようにかなりばかげた、2番目のエラーを修正しましたが、1つは持続します。

4

1 に答える 1

5

オブジェクトを配列にキャストすると、プライベートメンバーと保護されたメンバーがマングルされます。\x00プライベートメンバーには、クラス名を囲むnullバイトがあります。これらをこのように使用するには、次のものが必要です。

$STH->bindParam(1, $media["\x00Media\x00media"]);
$STH->bindParam(2, $media["\x00Media\x00slug"]);
$STH->bindParam(3, serialize($media["\x00Media\x00info"]));
$STH->bindParam(4, $media["\x00Media\x00thumb"]);
$STH->bindParam(5, $media["\x00Media\x00type"]);
$STH->bindParam(6, $media["\x00Media\x00link"]);

彼らが保護されたメンバーである場合、彼らは\x00*\x00

また、パラメータをバインドしている順序が、挿入ステートメントのフィールドの順序と一致していないようです。

于 2012-07-06T20:49:15.423 に答える