PDO和PHP.未定义的索引,但它已定义


PDO and PHP. Undefined index, but it is defined

我有一个类:

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

我尝试使用 PHP PDO 将其保存到数据库中:

$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 个错误:

注意:未定义的索引:C:''wamp32''www''MM''index.php 中的 Mediainfo 在第 150 行

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所说的那样很愚蠢,但一个仍然存在。

将对象强制转换为数组时,私有成员和受保护成员将被破坏。私有成员的类名周围'x00具有空字节。要以这种方式使用它们,您需要:

$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

此外,绑定参数的顺序似乎与插入语句中字段的顺序不匹配。