2011-06-27 16 views
5

używam do problemów z następującego kodu:problem z tablicą

$ids = '"' . implode('", "', $crumbs) . '"'; 
$motd = array(); 
$dober = $db->query("SELECT id, name, msg, datetime FROM tbl_depts td INNER JOIN tbl_motd tm ON td.id = tm.deptid WHERE td.id IN (" . $ids . ")"); 

while ($row = $dober->fetch_array()) { 
       $motd[] = $row; 
     } 

print_r to ujawnia:

Array 
(
[0] => Array 
    (
     [0] => 1 
     [id] => 1 
     [1] => Management 
     [name] => Management 
     [2] => New Management Rule! 
     [msg] => New Management Rule! 
     [3] => 
     [datetime] => 
    ) 

[1] => Array 
    (
     [0] => 2 
     [id] => 2 
     [1] => Human Resources 
     [name] => Human Resources 
     [2] => DPS 
     [msg] => DPS 
     [3] => 
     [datetime] => 
    ) 
) 

jako takie, nie mogę użyć tego kodu do generowania rzeczy:

foreach ($motd[] as &$value) { 

     if ($motd['msg'] != "") { 
      if ($i == 0) { 
       ?> 


       <li><a href="#" title="content_<?php echo $value['id']; ?>" 
         class="tab active"><?php echo $value['name']; ?></a></li> 
       <? 
      } elseif ($i == $len - 1) { 
       ?> 
       <li><a href="#" title="content_<?php echo $value['id']; ?>" 
         class="tab"><?php echo $value['name']; ?></a></li> 

       <?php } else { ?> 
       <li><a href="#" title="content_<?php echo $value['id']; ?>" 
         class="tab"><?php echo $value['name']; ?></a></li> 
       <? 
      } 
      $i++; 
     } 
    } 

Wszelkie pomysły na temat tego, co robię źle tutaj?

EDIT: może się okazać, że łatwiej zrozumieć, jeśli czytasz ten pierwszy: Optimize this SQL query

+0

należy pamiętać, że ten kod jest podatny na ataki typu sql injection. –

+0

Tak jak sidenote ... może "fetch_assoc()" (http://www.php.net/manual/de/mysqli-result.fetch-assoc.php) lepiej pasuje do Twoich potrzeb? – pinkgothic

+0

Mogę coś przeoczyć, ale powinieneś umieścić '$ i = 0;' przed 'foreach', i nie potrzebujesz' [] 'po' $ motd'. – kapa

Odpowiedz

3

pierwsze - kod nie będzie działać z powodu tych dwóch liniach:

foreach ($motd[] as &$value) { 
    if ($motd['msg'] != "") { 

należy użyć $ motd, nie $ motd [] w foreach i sprawdzić wartość $ msg [ ''] nie [ '$ motd msg']

drugie, spróbuj użyć mysql_fetch_assoc zamiast mysql_fetch_array

Po trzecie - nie ma wartości początkowej dla $ i.

1

1.) może mieć problem z foreach ($motd[] as &$value) { chyba powinno być foreach ($motd as &$value) {

2.) wolałbym używać do() zamiast pętli foreach.

for($a=0, $cnt=count($motd)-1; $a<=$cnt; $a++) 
    { 
     if($motd[$a]["msg"] != "") 
     { 
      #do something here 
     } 
    } 
1

Odtąd przepisałem trochę twój kod. Nie trzeba definiować całego kodu HTML tylko kilka razy, ponieważ jest w nim niewielka zmiana (zauważyłem tylko active).

$i=0; 
foreach ($motd as $value) { 
    if ($value['msg'] != "") { 

     $active = $i == 0 ? ' active' : ''; //based on the value of `$i` 

     ?> 
     <li> 
     <a href="#" 
      title="content_<?php echo $value['id']; ?>" 
      class="tab<?php echo $active?>"><?php echo $value['name']; ?></a></li> 
     <?php 

     $i++; 
    } 
} 

Jak zauważył w komentarzach wcześniejszych:

  1. W foreach trzeba określić samą tablicę, nie trzeba [].
  2. Zawsze inicjuj swoje $i.
  3. Nie potrzebujesz &$value, potrzebujesz tylko tego odniesienia, jeśli chcesz zmodyfikować swoją tablicę w foreach.
+0

Dzięki :) - zauważ, że powinna być wartość $ '[' msg '] w linii 2. – bear

+0

@Shamil Dzięki :). – kapa