不能将assign-op运算符用于重载对象或字符串偏移

时间:2012-05-24 17:20:36

标签: php mysql overloaded-strings

我有这部分代码,它给了我标题中的错误。

我为每张桌子提供1到5的计数$k

$myarray至少包含3到4个名字。

错误发生在 $qu .= ...

的行中

到目前为止我尝试了什么:将变量名$i更改为$v{$i}行中的$qu .=

那么有没有可能迭代查询?因此,AND子句中的WHERE与数组的计数一样多?{/ p>

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++;
}

1 个答案:

答案 0 :(得分:6)

您似乎误解了一些基本的PHP语法。

the manual中所述:

  

string中的字符可以通过在string使用方括号array括号后指定所需字符的从零开始的偏移来访问和修改,如 {{ 1}} 的。为此目的,可以将string视为array个字符。当您想要提取或替换多个字符时,可以使用函数substr()substr_replace()

     
    

注意: String也可以使用大括号进行访问,例如 $str[42] ,出于同样的目的。

  

因此,在整个代码中使用花括号(除了那些定义$str{42}控制结构范围的花括号)完全是错误的,并且无法实现您的意图。

其次,从您的代码中可以看出,您将关系数据存储在序列化的PHP对象中;这违背了使用像MySQL这样的RDBMS的许多好处。除非您有其他令人信服的理由,否则您应该以normalised形式存储PHP对象。例如,不是每个for记录都包含一个description字段,该字段包含一个序列化的PHP对象,其属性是包含内嵌名称字符串的数组,只需将每个这样的名称存储在一个新的Name中。引用descriptionNames表中相关记录的表:

description

您似乎还有五个(示意性)相同的表,名为CREATE TABLE descriptionNames ( descriptionID INT NOT NULL, name VARCHAR(50), PRIMARY KEY (descriptionId, name), FOREIGN KEY (descriptionId) REFERENCES description (descriptionId) ); Table ID=1等?如果是这样,您应该可能将您的五个表合并为一个表(如果需要),以指示记录来自哪个表;我还建议更改你的表名,以便他们避免使用像空格和Table ID=2这样的特殊字符,因为如果你忘记正确引用它们,它们可能只会引起麻烦和混乱。例如:

=

无论如何,你不应该使用古老的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`; 函数。它们已不再维护,社区已开始deprecation process。相反,您应该了解prepared statements并使用PDO抽象层或改进的MySQLi扩展名。

如果您需要维护现有的数据结构,使用PDO可以执行以下操作:

mysql_*

但是,使用我提议的新数据结构,您只需要执行:

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