2012-05-24 31 views
5

Tôi có phần mã này và nó cho tôi lỗi trong tiêu đề.Không thể sử dụng toán tử gán-op với đối tượng bị quá tải hoặc bù trừ chuỗi

Tôi có một số $k từ 1 đến 5 cho mỗi bảng.

$myarray bao gồm ít nhất 3 đến 4 tên.

Lỗi này xảy ra trong dòng với $qu .= ...

gì tôi đã cố gắng cho đến nay: thay đổi variablename $i để $v{$i} trong dòng $qu .=.

Vì vậy, có khả năng lặp lại truy vấn không? Vì vậy, nó có nhiều số AND s trong mệnh đề WHERE khi số lượng của mảng là?

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

Bạn có thể cân nhắc thiết kế lại mã để sử dụng từ khóa "LIMIT" từ MySQL làm bộ đếm các lần lặp lại. – Avyakt

Trả lời

6

Dường như bạn đã hiểu sai cú pháp PHP cơ bản.

Như đã đề cập trong the manual:

Nhân vật trong string s có thể được truy cập và sửa đổi bằng cách xác định zero-based bù đắp của nhân vật mong muốn sau khi sử dụng string vuông array ngoặc, như trong $str[42]. Hãy nghĩ về một số string là một số array cho mục đích này. Các chức năng substr()substr_replace() có thể được sử dụng khi bạn muốn trích xuất hoặc thay thế nhiều hơn 1 ký tự.

Lưu ý:String s cũng có thể được truy cập bằng niềng răng, như trong $str{42}, với mục đích tương tự.

Do đó việc bạn sử dụng dấu ngoặc nhọn khắp mã của bạn (trừ các đối tượng xác định phạm vi của cấu trúc for kiểm soát) là hoàn toàn sai lầm và không thực hiện những gì bạn có ý định.

Thứ hai, từ mã của bạn, có vẻ như bạn đang lưu trữ dữ liệu quan hệ trong các đối tượng PHP được tuần tự hóa; điều này đánh bại nhiều lợi ích của việc sử dụng một RDBMS như MySQL. Trừ khi bạn có lý do thuyết phục để làm khác, bạn nên lưu trữ các đối tượng PHP của mình dưới dạng normalised. Ví dụ: thay vì mỗi bản ghi description có trườngchứa một đối tượng PHP được tuần tự hóa mà các thuộc tính của nó là các chuỗi giữ tên, chỉ lưu trữ mỗi tên như vậy trong một bảng descriptionNames mới tham chiếu đến bản ghi liên quan trong bảng description:

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

Dường như bạn có năm bảng giống hệt nhau (sơ đồ) có tên là Table ID=1, Table ID=2, v.v ...?Nếu vậy, bạn nên có thể là kết hợp năm bảng của bạn thành một, với một cột (nếu muốn) để chỉ ra từ bảng nào bản ghi bắt nguồn; Tôi cũng khuyên bạn nên thay đổi tên bảng để tránh sử dụng các ký tự đặc biệt như khoảng trắng và = vì chúng có thể sẽ chỉ gây ra rắc rối và nhầm lẫn sâu hơn trên đường nếu bạn quên trích dẫn chính xác chúng. Ví dụ:

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

Trong mọi trường hợp, bạn không nên sử dụng chức năng mysql_* cũ. Chúng không còn được duy trì và cộng đồng đã bắt đầu deprecation process. Thay vào đó, bạn nên tìm hiểu về prepared statements và sử dụng lớp trừu tượng PDO hoặc tiện ích mở rộng khác được cải thiện MySQLi.

Nếu bạn cần phải duy trì cấu trúc dữ liệu hiện tại của bạn, với PDO bạn có thể làm một cái gì đó như:

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

Tuy nhiên, sử dụng đề xuất cấu trúc dữ liệu mới của tôi, bạn sẽ chỉ cần làm:

$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 cảm ơn bạn. tôi đã cập nhật bài đăng nhập ban đầu của mình với toàn bộ mã. bởi vì sau khi bài viết của bạn có vẻ như với tôi rằng nó có lẽ sẽ tốt hơn để đăng toàn bộ mã. nếu không có bất kỳ thay đổi trong câu trả lời của bạn bây giờ tôi sẽ thử nó với pdo hoặc mysqli. cảm ơn một lần nữa –

+0

@little_fck: Tôi đã cập nhật câu trả lời của mình để phản ánh mã đầy đủ hơn. – eggyal

Các vấn đề liên quan