Sembra che tu abbia frainteso qualche sintassi base di PHP.
Come menzionato in the manual:
caratteri all'interno string s possono essere accessibili e modificabili specificando la base zero offset del carattere desiderato dopo la string utilizzando quadrato array parentesi, come in $str[42]
. Pensa a un string come array di caratteri per questo scopo. Le funzioni substr()
e substr_replace()
possono essere utilizzate quando si desidera estrarre o sostituire più di 1 carattere.
Nota:String s possono essere accessibili tramite graffe, come in $str{42}
, per lo stesso scopo.
Pertanto l'utilizzo di parentesi graffe in tutto il codice (ad eccezione di quelle che definiscono la portata della struttura for
di controllo) sono del tutto errate e non realizzare ciò che si intende.
In secondo luogo, dal vostro codice sembra che stiate memorizzando i dati relazionali in oggetti PHP serializzati; questo vanifica molti dei vantaggi dell'uso di un RDBMS come MySQL. A meno che tu non abbia validi motivi per fare altrimenti, dovresti probabilmente archiviare gli oggetti PHP in un modulo normalised. Ad esempio, piuttosto che ogni record description
con un campo Name
che contiene un oggetto PHP serializzato le cui proprietà sono matrici che contengono stringhe di nomi implose, è sufficiente memorizzare ciascun nome in una nuova tabella descriptionNames
che fa riferimento al record correlato nella tabella description
:
Sembra inoltre che ci siano cinque tabelle (schematicamente) identiche denominate Table ID=1
, Table ID=2
, ecc.?In tal caso, dovresti probabilmente combinare le cinque tabelle in una, con una colonna (se lo desideri) per indicare da quale tabella è stato generato il record; Vorrei anche suggerire di modificare i nomi delle tabelle in modo che evitino l'utilizzo di caratteri speciali come spazi bianchi e =
poiché potrebbero causare problemi e confusione ulteriormente se si dimentica di citarli correttamente. Per esempio:
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 ogni caso, non si dovrebbe usare le antiche mysql_*
funzioni. Non vengono più gestiti e la comunità ha iniziato il deprecation process. Dovresti invece conoscere lo prepared statements e utilizzare il livello di astrazione PDO oppure l'estensione migliorata MySQLi.
Se è necessario mantenere la struttura dati esistenti, con PDO si potrebbe fare qualcosa di simile:
$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/>";
}
}
Tuttavia, usando la mia nuova proposta di struttura dei dati, si sarebbe solo bisogno di fare:
$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/>";
}
Potresti prendere in considerazione la riprogettazione del codice per utilizzare la parola chiave "LIMIT" da MySQL come contatore di iterazioni. – Avyakt