2012-05-24 6 views
5

Ho questa parte di codice e mi dà l'errore nel titolo.Impossibile utilizzare gli operatori assign-op con oggetti sovraccaricati né offset di stringa

Ho un conteggio $k da 1 a 5 per ogni tabella.

$myarray consiste di almeno 3 o 4 nomi.

l'errore si verifica in linea con $qu .= ...

quello che ho provato finora: cambiare il variablename $i al $v{$i} nella linea $qu .=.

Quindi c'è qualche possibilità di iterare la query? In modo che abbia il numero di AND s nella clausola WHERE come il conteggio dell'array?

while ($k<=5) { 
    $queryname = "SELECT Name FROM description"; 
    $qname = mysql_query($queryname,$link); 

    while ($reihe = mysql_fetch_object($qname)) { 
    { 
     $unse = unserialize($reihe->Name); 
     { 
     foreach ($unse as $j=>$h) 
      foreach ($h as $m) { 
      $myarray = preg_split('/ |\s| /',$m); 
      { 
       echo "<br>"; 
       $array_empty = $myarray; 
       $empty_elements = array(""); 
       $myarray = array_diff($array_empty,$empty_elements); 
       var_dump($myarray); 
       for ($i=1; $i<=count($myarray); $i++) { 
       $v{$i} = $myarray[$i]; 
       echo $v{$i}; 
       $esc{$i} = strtolower(mysql_escape_string($v{$i})); 
       echo "<br>" . $esc{$i} . "<br>"; 
       $qu = "SELECT * FROM `table ID=$k` WHERE"; 
       $qu{$i} .= "AND `table ID=$k`.`name` LIKE '%$esc{$i}%'"; 
       } 
      } 
      } 
     { 
      $test_a = mysql_query($qu,$link) or die (mysql_error()); 
      echo "<br>"; 
      var_dump($test_a); 
      for ($x=0; $x<mysql_num_rows($test_a); $x++) { 
      $row = mysql_result($test_a,$x,'data1'); 
      $namee = mysql_result($test_a,$x,'data2'); 
      echo 'data1' . $row . '<br>'; 
      echo 'data2' . $namee . '<br>'; 
      } 
     } 
     } 
    } 
    } 
    $k++; 
} 
+0

Potresti prendere in considerazione la riprogettazione del codice per utilizzare la parola chiave "LIMIT" da MySQL come contatore di iterazioni. – Avyakt

risposta

6

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/>"; 
} 
+0

ok grazie. ho aggiornato il mio post originale con l'intero codice. perché dopo il tuo post mi è sembrato che sarebbe probabilmente meglio postare l'intero codice. se non c'è alcun cambiamento nella tua risposta ora, proverò con pdo o mysqli. grazie ancora –

+0

@little_fck: ho aggiornato la mia risposta per riflettere il codice più completo. – eggyal

Problemi correlati