Dường như bạn đã hiểu sai cú pháp PHP cơ bản.
Như đã đề cập trong the manual:
Nhân vật trong string s có thể được truy cập và sửa đổi bằng cách xác định zero-based bù đắp của nhân vật mong muốn sau khi sử dụng string vuông array ngoặc, như trong $str[42]
. Hãy nghĩ về một số string là một số array cho mục đích này. Các chức năng substr()
và substr_replace()
có thể được sử dụng khi bạn muốn trích xuất hoặc thay thế nhiều hơn 1 ký tự.
Lưu ý:String s cũng có thể được truy cập bằng niềng răng, như trong $str{42}
, với mục đích tương tự.
Do đó việc bạn sử dụng dấu ngoặc nhọn khắp mã của bạn (trừ các đối tượng xác định phạm vi của cấu trúc for
kiểm soát) là hoàn toàn sai lầm và không thực hiện những gì bạn có ý định.
Thứ hai, từ mã của bạn, có vẻ như bạn đang lưu trữ dữ liệu quan hệ trong các đối tượng PHP được tuần tự hóa; điều này đánh bại nhiều lợi ích của việc sử dụng một RDBMS như MySQL. Trừ khi bạn có lý do thuyết phục để làm khác, bạn nên lưu trữ các đối tượng PHP của mình dưới dạng normalised. Ví dụ: thay vì mỗi bản ghi description
có trườngchứa một đối tượng PHP được tuần tự hóa mà các thuộc tính của nó là các chuỗi giữ tên, chỉ lưu trữ mỗi tên như vậy trong một bảng descriptionNames
mới tham chiếu đến bản ghi liên quan trong bảng description
:
CREATE TABLE descriptionNames (
descriptionID INT NOT NULL,
name VARCHAR(50),
PRIMARY KEY (descriptionId, name),
FOREIGN KEY (descriptionId) REFERENCES description (descriptionId)
);
Dường như bạn có năm bảng giống hệt nhau (sơ đồ) có tên là Table ID=1
, Table ID=2
, v.v ...?Nếu vậy, bạn nên có thể là kết hợp năm bảng của bạn thành một, với một cột (nếu muốn) để chỉ ra từ bảng nào bản ghi bắt nguồn; Tôi cũng khuyên bạn nên thay đổi tên bảng để tránh sử dụng các ký tự đặc biệt như khoảng trắng và =
vì chúng có thể sẽ chỉ gây ra rắc rối và nhầm lẫn sâu hơn trên đường nếu bạn quên trích dẫn chính xác chúng. Ví dụ:
ALTER TABLE `Table ID=1`
RENAME TO CombiTable,
ADD COLUMN FromTableID TINYINT NOT NULL;
UPDATE CombiTable SET FromTableID = 1;
INSERT INTO CombiTable
SELECT *, 2 FROM `Table ID=2` UNION ALL
SELECT *, 3 FROM `Table ID=3` UNION ALL
SELECT *, 4 FROM `Table ID=4` UNION ALL
SELECT *, 5 FROM `Table ID=5`;
SELECT * FROM CombiTable; -- check everything is okay
DROP TABLE `Table ID=2`, `Table ID=3`, `Table ID=4`, `Table ID=5`;
Trong mọi trường hợp, bạn không nên sử dụng chức năng mysql_*
cũ. Chúng không còn được duy trì và cộng đồng đã bắt đầu deprecation process. Thay vào đó, bạn nên tìm hiểu về prepared statements và sử dụng lớp trừu tượng PDO hoặc tiện ích mở rộng khác được cải thiện MySQLi.
Nếu bạn cần phải duy trì cấu trúc dữ liệu hiện tại của bạn, với PDO bạn có thể làm một cái gì đó như:
$dbh = new PDO("mysql:dbname=$dbname;charset=utf8", $user, $password);
$qry = $dbh->query("SELECT Name FROM description");
$myarray = array();
while ($reihe = $dbh->fetchColumn())
foreach (unserialize($reihe) as $h)
foreach ($h as $m)
array_merge($myarray, preg_split("/\s+/", $m, -1, PREG_SPLIT_NO_EMPTY));
for ($k = 1; $k <= 5; $k++) {
$qry = $dbh->prepare("SELECT * FROM `table ID=$k` WHERE " . implode(" OR ",
array_pad(array(), count($myarray), "name LIKE CONCAT('%', ?, '%')")
));
$qry->execute($myarray);
while($row = $qry->fetch()) {
echo "data1:$row[data1]<br/>";
echo "data2:$row[data2]<br/>";
}
}
Tuy nhiên, sử dụng đề xuất cấu trúc dữ liệu mới của tôi, bạn sẽ chỉ cần làm:
$dbh = new PDO("mysql:dbname=$dbname;charset=utf8", $user, $password);
$qry = $dbh->query("
SELECT *
FROM CombiTable JOIN descriptionNames USING (name)
WHERE FromTableID BETWEEN 1 AND 5 -- in case you have others?
ORDER BY FromTableID
");
while ($row = $qry->fetch()) {
echo "data1:$row[data1]<br/>";
echo "data2:$row[data2]<br/>";
}
Bạn có thể cân nhắc thiết kế lại mã để sử dụng từ khóa "LIMIT" từ MySQL làm bộ đếm các lần lặp lại. – Avyakt