Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Деревья и редактирование данных


Автор: Redstuff 11.5.2009, 18:46
есть таблица
tree
с полями
id | title | pid
----------------
1  |  a    |  0
2  |  b    |  0
3  |  c    |   0
4  |  a1  |  1
5  |  a2  |  1
6  |  b1  |  2
.....

для вывода всего списка использую:
Код

$result = mysql_query("SELECT * FROM tree ORDER BY title;", $link);
        while($row = mysql_fetch_array($result)){
               echo '<a href="index.php?op=typedoc&id='.$row['id'].'">'.stripslashes($row['title']).'</a>';
        }


для редактирования данных переходим по нужной ссылке, где расположенна форма с текущими данными

Код

<?php 
$result = mysql_query("SELECT * FROM tree WHERE id = '".$_GET['id']."';", $link);
$row = mysql_fetch_array($result);
?>

<input type="text" name="title" value="<?=htmlspecialchars(stripslashes($row['title']));?>" class="enter" size="79">


тут все порядок, поле title редактируется, но как редактировать правильно поле pid?

Автор: bars80080 11.5.2009, 22:53
список select с выборкой источников pid? (родительские страницы, так я понимаю? тогда список всех страниц)

Автор: Redstuff 12.5.2009, 13:59
bars80080, ага делаю список select.  Вся проблема походу в запросе для выборки, активным делает всегда id=1.

Код

<?php
$result = mysql_query("SELECT * FROM tree WHERE id = '".$_GET['id']."';", $link);
$row = mysql_fetch_array($result);
echo '<select name="pid">';
$result = mysql_query("SELECT id, title, pid FROM tree");
while($row = mysql_fetch_object($result2)) {
   if($row->title == $row['pid']){
      echo "<option selected='selected' value='".$row->id."'>".$row->title."</option>";
   } else {
      echo "<option value='".$row->id."'>".$row->title."</option>";
   }
}
  echo '</select>';
?>

Автор: bars80080 12.5.2009, 14:11
я б на твоём месте посмотрел, что есть в $row->title  и $row['pid']
как я догадываюсь в первом пустая строка, во втором ноль

во-вторых задался бы вопросом, почему к объекту идёт обращение как к массиву. оно видимо прокатывает, но зато путает

а в-третьих, по какому признаку нужно выделить один из пунктов?

Автор: Redstuff 13.5.2009, 12:18
bars80080, вот для простоты без списка

Код

$result = mysql_query("SELECT id, title, pid FROM tree WHERE id= '".$_GET['id']."';", $link);
      $row = mysql_fetch_object($result);
      echo $row->id;         
      echo $row->title;
      echo $row->pid;


Код

6  
b1
2


выделять нужно по pid


т.е. необходимо получить:

поле input: b1
список select:
- _ (пустое, чтобы можно было присваивать значение id=0 для pid)
- a 
- b (selected)
- c
- a1
- a2
- b1
...



Автор: Redstuff 13.5.2009, 13:02
Если сделать 2 запроса
Код

$result = mysql_query("SELECT id, title, pid FROM tree WHERE id= '".$_GET['id']."';", $link);
$row = mysql_fetch_object($result);
echo $row->id;
echo $row->title;
echo $row->pid;

$result2 = mysql_query("SELECT id, title, pid FROM tree WHERE id = '".$row->pid."';", $link);
$row2 = mysql_fetch_array($result2);
echo $row2['title'];


Код

6  
b1
2
b


но мне кажется это не правильный подход, да и список не получается сделать

Автор: Redstuff 13.5.2009, 14:07
список сделал, не знаю только как реализовать пустое поле для того, чтобы присваивать или выводить pid=0
Код

<?php
$sql2 = "SELECT * FROM tree WHERE id = '".$_GET['id']."';";
$result2 = mysql_query($sql2, $link);
$row2 = mysql_fetch_array($result2);

$result3 = mysql_query("SELECT * FROM tree WHERE id = '".$row2['pid']."';", $link);
$row3 = mysql_fetch_array($result3);

echo '<select name="pid">';
$result4 = mysql_query("SELECT id, title, pid FROM tree;");
while($row4 = mysql_fetch_object($result4)){
   if($row3['id'] == $row4->id){
      echo "<option selected='selected' value='".$row3->id."'>".$row3['title']."</option>";
   }
   else{
      echo "<option value='".$row4->id."'>".$row4->title."</option>";
   }
}
echo '</select>';
?>


и хотелось бы код сделать более правильным... 

Автор: bars80080 13.5.2009, 14:30
на пути к правильному коду
Код

$sql = 'SELECT id, title, pid FROM tree;';
$r = select_from_db($sql);
$select = formSelect($r, 'pid', array('id','titile'), $row3['id'], 4, true);

echo $select;


/**************************************************************************/
function select_from_db($q, $id = false) {
    $r = mysql_query($q); $n = 0;
    if(!empty($r)) $n = mysql_num_rows($r);
    if($id === true) { for($i = 0; $i < $n; $i++) {
            $a = mysql_fetch_array($r, MYSQL_ASSOC); $s[$a['id']] = $a; }}
    elseif($id) { for($i = 0; $i < $n; $i++) {
            $a = mysql_fetch_array($r, MYSQL_ASSOC); $s[$a[$id]] = $a; }}
    else { for($i = 0; $i < $n; $i++) { $s[$i] = mysql_fetch_array($r, MYSQL_ASSOC); }}
    if(!empty($s)) return $s;
    else return array(); }
function formSelect($itxt, $name = '', $val = array(), $selected = 0, $data = 0, $nullF = false, $atr = '', $optatr = array()) {
    $html = '<select name="'.$name.'" '.$atr.">\r\n";
    if($nullF) { $html .= '<option value="0"> </option>'; }
    if($data == 3) { $start = $itxt; $count = $val[0]; $step = $val[1]; }
    else { $count = count($itxt); }
    for($i = 0; $i < $count; $i++) {
        if($data == 1) { $key = $val[$i]; $txt = $itxt[$i]; }
        elseif($data == 2) { $key = $i; $txt = $itxt[$i]; }
        elseif($data == 3) { $txt = $key = ($start + ($step*$i)); }
        elseif($data == 4) { $key = $itxt[$i][$val[0]]; $txt = $itxt[$i][$val[1]]; }
        else { $key = $txt = $itxt[$i]; }
        if($selected == $key) { $sel = 'selected'; } else { $sel = ''; }
        if(!empty($optatr[$i])) { $opt = $optatr[$i]; } else { $opt = ''; }
        $html .= '<option value="'.$key.'" '.$sel.$opt.'>'.$txt."</option>\r\n";
    }
    $html .= "</select>\r\n";
    return $html;
}

Автор: Redstuff 16.5.2009, 17:54
bars80080, спасибо)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)