1. Giới thiệu lỗi Uncaught TypeError
Khi làm việc với PHP, bạn có thể gặp lỗi “Uncaught TypeError: Cannot access offset of type string on string”. Lỗi này xảy ra khi bạn cố truy cập một phần tử của một chuỗi (đối tượng kiểu string) như thể nó là một mảng.
Bài viết này sẽ phân tích nguyên nhân gây ra lỗi và hướng dẫn bạn cách khắc phục hiệu quả.
2. Nguyên nhân gây ra lỗi
Lỗi này xảy ra khi bạn truy cập một offset (chỉ mục) trên một biến kiểu string, trong khi PHP mong đợi đó là một mảng (array). Dưới đây là một số tình huống dẫn đến lỗi:
2.1. Biến được mong đợi là mảng nhưng lại là chuỗi
Ví dụ sai:
$data = "Hello World";
echo $data['key']; // ❌ Lỗi: Truy cập offset trên chuỗi
2.2. Dữ liệu JSON bị lỗi khi decode
Ví dụ sai:
$jsonString = '{"name": "John"}';
$data = json_decode($jsonString); // Mặc định không chuyển về mảng
echo $data['name']; // ❌ Lỗi: $data là object, không phải mảng
2.3. Biến bị gán nhầm giá trị
Trong quá trình truy vấn CSDL hoặc làm việc với dữ liệu, biến lẽ ra string thay vì array.
Ví dụ sai:
$data = mysqli_fetch_assoc($result);
if (!$data) {
$data = "Lỗi khi truy vấn";
}
echo $data['name']; // ❌ Lỗi: $data là chuỗi
3. Cách khắc phục lỗi
3.1. Kiểm tra kiểu dữ liệu trước khi truy cập offset
Sử dụng is_array() trước khi truy cập một offset:
if (is_array($data) && isset($data['key'])) {
echo $data['key']; // ✅ Truy cập an toàn
} else {
error_log("⚠️ Lỗi: data không phải là mảng hoặc không có 'key'");
}
3.2. Chuyển JSON về mảng khi decode
Thêm tham số true khi dùng json_decode():
$data = json_decode($jsonString, true); // ✅ Chuyển về array
3.3. Debug giá trị biến trước khi dùng
Sử dụng var_dump() hoặc print_r():
var_dump($data);
die();
3.4. Kiểm tra dữ liệu từ database
Tránh gán chuỗi khi truy vấn lỗi:
$data = mysqli_fetch_assoc($result) ?: [];
4. Kết luận
Lỗi “Uncaught TypeError: Cannot access offset of type string on string” trong PHP chủ yếu do truy cập offset của biến chuỗi như một mảng.
✅ Để khắc phục:
- Kiểm tra dữ liệu với
is_array()
trước khi truy cập offset. - Dùng json_decode($json, true) khi làm việc với JSON.
- Debug với var_dump() để xem kiểu dữ liệu.
- Kiểm tra truy vấn database trước khi gán biến.
Hy vọng bài viết giúp bạn khắc phục lỗi nhanh chóng! 🚀