2012-05-24 15 views
5

Tengo esta parte del código y me da el error en el título.No se pueden usar operadores assign-op con objetos sobrecargados ni desplazamientos de cadena

Tengo un recuento $k de 1 a 5 para cada tabla.

$myarray consiste en al menos 3 a 4 nombres.

El error se produce en la línea con $qu .= ...

lo que he intentado hasta ahora: el cambio de la nombredevariable $i a $v{$i} en la línea $qu .=.

¿Hay alguna posibilidad de repetir la consulta? ¿Para que tenga tantos AND s en la cláusula WHERE como el conteo de la matriz?

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

Podría considerar rediseñar su código para usar la palabra clave "LIMIT" de MySQL como contador de iteraciones. – Avyakt

Respuesta

6

Parece que ha entendido mal algunas sintaxis básicas de PHP.

como se menciona en the manual:

Caracteres dentro string s se puede acceder y modificar mediante la especificación de la base cero-offset del carácter deseado después de la string usando cuadrado array soportes, como en $str[42]. Piense en un string como array de caracteres para este propósito. Las funciones substr() y substr_replace() se pueden usar cuando desee extraer o reemplazar más de 1 carácter.

Nota:String s también pueden ser accedidas usando llaves, como en $str{42}, para el mismo propósito.

lo tanto, su uso de llaves en todo el código (a excepción de las que definen el alcance de la estructura de control for) son totalmente errónea y no lograr lo que se propone.

En segundo lugar, de su código parece que está almacenando datos relacionales en objetos PHP serializados; esto frustra muchos de los beneficios de usar un RDBMS como MySQL. A menos que tenga razones convincentes para hacer lo contrario, probablemente debería almacenar sus objetos PHP en un formulario normalised. Por ejemplo, en lugar de cada registro description con un campo Name que contiene un objeto PHP serializado cuyas propiedades son matrices que contienen cadenas imploded de nombres, simplemente almacene cada uno de esos nombres en una nueva tabla descriptionNames que haga referencia al registro relacionado en la tabla description:

CREATE TABLE descriptionNames (
    descriptionID INT NOT NULL, 
    name VARCHAR(50), 
    PRIMARY KEY (descriptionId, name), 
    FOREIGN KEY (descriptionId) REFERENCES description (descriptionId) 
); 

también parece que usted tiene cinco (esquemáticamente) tablas idénticas nombrados Table ID=1, Table ID=2, etc.?Si es así, debe probablemente combine sus cinco tablas en una, con una columna (si así lo desea) para indicar de qué tabla se originó el registro; También te sugiero que cambies los nombres de tu tabla para evitar el uso de caracteres especiales como el espacio en blanco y =, ya que es probable que solo causen problemas y confusión en el futuro si olvidas citarlos correctamente. Por ejemplo:

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`; 

En cualquier caso, no debe utilizar los antiguos mysql_* funciones. Ya no se mantienen y la comunidad ha comenzado el deprecation process. En su lugar, debe aprender acerca de prepared statements y utilizar la capa de abstracción PDO o la extensión mejorada MySQLi.

Si usted necesita para mantener su estructura de datos existente, con DOP se podía hacer algo como:

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

Sin embargo, el uso de mi nueva estructura de datos propuesta, que sería sólo necesita hacer:

$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 gracias. He actualizado mi entrada de entrada original con todo el código. porque después de su publicación me pareció que probablemente sería mejor publicar todo el código. si no hay ningún cambio en su respuesta ahora lo intentaré con pdo o mysqli. gracias de nuevo –

+0

@little_fck: He actualizado mi respuesta para reflejar su código más completo. – eggyal

Cuestiones relacionadas