Sie scheinen einige grundlegende PHP-Syntax falsch verstanden zu haben.
Wie in the manual erwähnt:
Charaktere innerhalb string s können durch die Angabe des Null-Basis-Offset des gewünschten Zeichens nach den string mit quadratischen array Klammern, wie in $str[42]
abgerufen und geändert werden. Denken Sie an eine string als array von Zeichen für diesen Zweck. Die Funktionen substr()
und substr_replace()
können verwendet werden, wenn Sie mehr als 1 Zeichen extrahieren oder ersetzen möchten.
Hinweis:String s auch zugegriffen werden kann geschweiften Klammern, wie in $str{42}
, für den gleichen Zweck.
Deshalb ist ihre Verwendung von geschweiften Klammern im gesamten Code (mit Ausnahme der Festlegung des Umfangs der for
Kontrollstruktur) sind völlig falsch und sie erreichen nicht das, was Sie beabsichtigen.
Zweitens, aus Ihrem Code scheint es, dass Sie relationale Daten in serialisierten PHP-Objekten speichern; Dies verhindert viele der Vorteile eines RDBMS wie MySQL. Wenn Sie keine zwingenden Gründe haben, etwas anderes zu tun, sollten Sie Ihre PHP-Objekte wahrscheinlich in einem Formular normalised speichern. Beispiel: Anstatt jeden description
Datensatz mit einem Name
Feld, das ein serialisiertes PHP-Objekt enthält, deren Eigenschaften Arrays sind, die implodierte Namensfolgen enthalten, speichern Sie jeden solchen Namen in einer neuen descriptionNames
Tabelle, die auf den zugehörigen Datensatz in der description
Tabelle verweist:
CREATE TABLE descriptionNames (
descriptionID INT NOT NULL,
name VARCHAR(50),
PRIMARY KEY (descriptionId, name),
FOREIGN KEY (descriptionId) REFERENCES description (descriptionId)
);
Es scheint auch, dass Sie fünf (schematisch) identische Tabellen mit den Namen Table ID=1
, Table ID=2
usw. haben?Wenn ja, sollten Sie wahrscheinlich kombinieren Sie Ihre fünf Tabellen zu einem, mit einer Spalte (wenn gewünscht) zu zeigen, aus welcher Tabelle der Datensatz stammt; Ich würde auch vorschlagen, Ihre Tabellennamen zu ändern, so dass sie die Verwendung von Sonderzeichen wie Leerzeichen und =
vermeiden, da sie wahrscheinlich nur Ärger und Verwirrung verursachen, wenn Sie vergessen, sie richtig zu zitieren. Zum Beispiel:
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`;
In jedem Fall sollten Sie nicht die alten mysql_*
Funktionen nutzen. Sie werden nicht mehr gepflegt und die Gemeinde hat die deprecation process begonnen. Stattdessen sollten Sie über prepared statements lernen und entweder die Abstraktionsschicht PDO oder die verbesserte Erweiterung MySQLi verwenden.
Wenn Sie Ihre vorhandenen Datenstruktur beibehalten müssen, mit gU Sie so etwas wie tun könnte:
$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/>";
}
}
jedoch meine vorgeschlagene neue Datenstruktur verwenden, würden Sie nur tun müssen:
$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/>";
}
Sie könnten in Erwägung ziehen, den Code neu zu gestalten, um das Schlüsselwort "LIMIT" von MySQL als Iterationszähler zu verwenden. – Avyakt