2012-05-24 3 views
5

Ich habe diesen Teil des Codes und es gibt mir den Fehler im Titel.Kann nicht assign-op-Operatoren mit überladenen Objekten noch String Offsets verwenden

Ich habe eine Zählung $k von 1 bis 5 für jede Tabelle.

$myarray besteht aus mindestens 3 bis 4 Namen.

Der Fehler tritt in der Zeile mit $qu .= ...

Was ich bisher versucht: dem Variablennamen $i zu $v{$i} in der $qu .= Linie zu ändern.

Gibt es also eine Möglichkeit, die Abfrage zu iterieren? So dass es so viele AND s in der WHERE Klausel als die Anzahl der Array ist?

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

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

Antwort

6

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

ok danke. Ich habe meinen ursprünglichen Beitrag mit dem gesamten Code aktualisiert. denn nach Ihrem Post schien es mir, dass es wahrscheinlich besser wäre, den ganzen Code zu posten. Wenn es keine Änderung in Ihrer Antwort gibt, werde ich es mit PDO oder Mysqli versuchen. Danke nochmals –

+0

@little_fck: Ich habe meine Antwort aktualisiert, um Ihren volleren Code wiederzugeben. – eggyal