我有一个班级:
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个错误:
注意:未定义的索引:第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说的那样愚蠢,但一个人仍然存在。
答案 0 :(得分:5)
将对象强制转换为数组时,私有成员和受保护成员会受到损坏。私有成员在类名称周围有空字节\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
此外,您绑定参数的顺序似乎与insert语句中的字段顺序不匹配。