PDO fetchAll返回stdClass,PHP BLOB处理遇未定义属性错误
解决PHP PDO访问BLOB数据时的Undefined Property错误
Hey there, let's break down why you're hitting that Notice: Undefined property: stdClass::$... error and fix it up!
问题根源
You’re mixing two conflicting PDO result-handling approaches: bindColumn() and fetchAll(PDO::FETCH_OBJ).
bindColumn()is built for row-by-row fetching (pair it withfetch(PDO::FETCH_BOUND)to populate bound variables).fetchAll(PDO::FETCH_OBJ)returns all results as an array of stdClass objects, completely ignoring anybindColumn()setup. The undefined property notice usually pops up here if you’re trying to access a column name that doesn’t exist (or you made a typo).
两种实用解决方案
方案1:直接用fetchAll(PDO::FETCH_OBJ)(简单快捷)
Ditch the bindColumn() calls entirely—they’re unnecessary here. Just make sure you’re using the exact column names from your tbl_blobs table.
$sql = "SELECT name, mime, data FROM tbl_blobs"; // 明确列名比SELECT *更安全 $stmt = $db->prepare($sql); $stmt->execute(); $items = $stmt->fetchAll(PDO::FETCH_OBJ); foreach ($items as $item) { // 替换成你表中实际的列名! echo "File Name: " . htmlspecialchars($item->name) . "<br>"; echo "MIME Type: " . htmlspecialchars($item->mime) . "<br>"; // 要是想显示BLOB图片,可以这样处理: // echo '<img src="data:' . $item->mime . ';base64,' . base64_encode($item->data) . '" alt="' . $item->name . '"><br>'; }
方案2:用bindColumn()处理大BLOB数据(内存友好)
If you’re working with large BLOB files (like high-res images or big documents), row-by-row fetching with bindColumn() is better for memory management. Here’s the correct way to do it:
$sql = "SELECT name, mime, data FROM tbl_blobs"; $stmt = $db->prepare($sql); $stmt->execute(); // 绑定列到变量(顺序要和SELECT中的列顺序完全一致) $stmt->bindColumn(1, $name); $stmt->bindColumn(2, $mime); $stmt->bindColumn(3, $data, PDO::PARAM_LOB); // 标记为LOB类型 // 逐行获取数据 while ($stmt->fetch(PDO::FETCH_BOUND)) { echo "File Name: " . htmlspecialchars($name) . "<br>"; echo "MIME Type: " . htmlspecialchars($mime) . "<br>"; // 要是想把BLOB保存到本地文件: // file_put_contents($name, $data); }
关键注意事项
- **别用SELECT ***: 明确列出列名能保证顺序和
bindColumn()的绑定顺序一致(如果用方案2的话)。 - 核对列名: 这个错误90%是因为你访问的属性名和数据库列名不匹配—仔细检查大小写和拼写(数据库的大小写敏感性取决于你的配置)!
内容的提问来源于stack exchange,提问作者jwknz
相关产品推荐
相关产品推荐

