цикъл и чекбокс

vankich

Registered
Имам следния проблем. Искам да направя форма за управление на файлове, но не се сещам как да ги контролирам от цикъла. Май с кода по-ясно ще стане какво искам да направя.

Код:
while ($da = mysql_fetch_assoc($qu)) {
		echo "<tr>
			<td><a href='".$da['url']."'>".$da['title']."</a></td>
			<td>".$da['uploader']."</td>
			<td>".$da['cat_title']."</td>
			<td>".$da['format']."</td>
			<td><input type='checkbox' name='checked'/></td>";
	}
	echo "</table>";
	echo "<form method='post' action=''>
		<input type='submit' name='approve' value='Удобри избраните'/>
		<input type='submit' name='archive' value='Прати в архив избраните'/>
		<input type='submit' name='delete' value='Изтрий избраните'/>
	</form>";
		if (isset($_POST['approve'])) {
			променям стойността на поле active на 1 в датабазата за маркираните файлове
		}
		if (isset($_POST['archive'])) {
			променям стойността на поле active на 2 в датабазата за маркираните файлове
		}
		if (isset($_POST['delete'])) {
			трия записите на маркираните файлове
		}
 
1. <input type='checkbox' name='checked'/> Това е форма!
2. По добре вместо if, if, if пише, if, elseif, elseif, else (грешка), по подробно и по добре четимо от PHP Engine, не че ще е съществена разликата, като препоръка.
3. Изобщо не разбирам какво искаш да направиш. Там дето си писал какво трябва да става, са основен тип заявки.
 
g9m29 каза:
3. Изобщо не разбирам какво искаш да направиш. Там дето си писал какво трябва да става, са основен тип заявки.
Ако кликна бутона approve трябва да променя поле от датабазата САМО на чекнатите файлове. Трябва ми да разбера каксе прави едното, а за другите разликата ще е само в заявката. Как да напарвя заявката сам на избраните с checkbox редове.
 
Не е голяма философия, правиш си един масив ( примерно $allchecked ), който да съдържа чекнатите ( това би трябвало да го можеш ) и след това идва foreach ( $allchecked as $checked ) {
UPDATE заявката }
 
Нещо оцапах по пътя. Може ли да го напишеш. По принцип масивите не съм ги изучавал подробно.
 
Код:
<?php
while($arr = mysql_fetch_assoc($rs)) {
	
	echo '<input type="checkbox" name="del[]" />';
}

?>

разгледай масива $_POST или там каквото ползваш и надявам се можеж да оделиш чекнатите от тези които не са!
 
Не си ги изучавал подробно и там ти е грешката. Това е основата и едно от най-важните неща в PHP. Така че вземи прочети не нещо, а повечето за масивите.

Код:
echo '<form method="post" action="">';
echo '<table>';
while ($da = mysql_fetch_assoc($sql)) {
    $id = $da['id'];
    echo '<tr>
         <td><a href=' . $da['url'] . '>' . $da['title'] . '</a></td>
         <td>' . $da['uploader'] . '</td>
         <td>' . $da['cat_title'] . '</td>
         <td>' . $da['format'] . '</td>';
    echo '<td><input type="checkbox" name="allchecked[' . $id . ']"/></td>';
    echo '</tr>';
}
echo '</table>';
echo '<input type="submit" name="approve" value="Удобри избраните"/>
      <input type="submit" name="archive" value="Прати в архив избраните"/>
      <input type="submit" name="delete" value="Изтрий избраните"/>
   </form>';

$allchecked = $_POST['allchecked'];
$clear_checked = array();
$junk = array();
foreach ($allchecked as $key) {
    if (!empty($check)) {
        $clear_checked[] = $key;
    } else {
        $junk[] = $key;
    }
}
if ($_POST['approve']) {
    foreach ($clear_checked as $key) {
        $sql = 'UPDATE `tablica` SET `active` = 1 WHERE `id` = ' . $key . '';
    }

    foreach ($junk as $key) {
        $sql = 'UPDATE `tablica` SET `active` = 0 WHERE `id` = ' . $key . '';
    }
} elseif ($_POST['archive']) {
    foreach ($clear_checked as $key) {
        $sql = 'UPDATE `tablica` SET `active` = 2 WHERE `id` = ' . $key . '';
    }

    foreach ($junk as $key) {
        $sql = 'UPDATE `tablica` SET `active` = 0 WHERE `id` = ' . $key . '';
    }
} elseif ($_POST['delete']) {
    foreach ($clear_checked as $key) {
        $sql = 'DELETE FROM `tablica` WHERE `id` = ' . $key . '';
    }

    foreach ($junk as $key) {
        $sql = 'UPDATE `tablica` SET `active` = 0 WHERE `id` = ' . $key . '';
    }
}

Като цяло какво прави кода:
1. Създава масив с ключ ид-то от таблицата.
2. Почистваме масива, ако има немаркирани.
3. Проверяваме коя опция е избрана и изпълняваме заявките.
!Внимание: Стойностите, който остават без "ЧЕК", биват запазвани в отделен масив, като след това, тяхната стойност в таблицата бива променена на 0. Не си споменал какво искаш да правиш с нечекнатите и аз добавих заявки, ти можеш да го промениш по свое усмотрение!
 
Warning: Invalid argument supplied for foreach() in D:\Webs\web\administration.php on line 122

122 ред ->
Код:
foreach ($allchecked as $key) { 
	    if (!empty($check)) { 
	        $clear_checked[] = $key; 
	    } else { 
	        $junk[] = $key; 
	    } 
	}
Също имам един въпрос. Трябва ли задължително да правя нещо с нечекнатите(заявки) или мога да ги оставя без заявки.
 
Код:
foreach ($allchecked as $key => $check) {
       if (!empty($check)) {
           $clear_checked[] = $key;
       } else {
           $junk[] = $key;
       }
   }
Ето това би трябвало да е кода, незнам защо не е изкарало $check, може и грешката да е моя, да съм го изтрил без да искам.
Отностно въпроса ти, да можеш да правиш каквото си искаш с масива с нечекнатите.
 
Код:
$qu = mysql_query("SELECT * FROM `files`, `cats` WHERE `files`.`cat_id`=`cats`.`id` AND `files`.`active`='0' ORDER BY `files`.`id` DESC") or die (mysql_error());
	echo '<form method="post" action="">'; 
	echo '<table>'; 
	while ($da = mysql_fetch_assoc($qu)) {  
	    echo '<tr> 
	         <td><a href=' . $da['url'] . '>' . $da['title'] . '</a></td> 
	         <td>' . $da['uploader'] . '</td> 
	         <td>' . $da['cat_title'] . '</td> 
	         <td>' . $da['format'] . '</td>'; 
	    echo '<td><input type="checkbox" name="allchecked[' . $da['id'] . ']"/></td>'; 
	    echo '</tr>'; 
	} 
	echo '</table>'; 
	echo '<input type="submit" name="approve" value="Удобри избраните"/> 
	      <input type="submit" name="archive" value="Прати в архив избраните"/> 
	      <input type="submit" name="delete" value="Изтрий избраните"/> 
	   </form>'; 

	$allchecked = $_POST['allchecked']; 
	$clear_checked = array(); 
	$junk = array(); 
	foreach ($allchecked as $key => $check) { 
		if (!empty($check)) { 
			$clear_checked[] = $key; 
		} else { 
			$junk[] = $key; 
		} 
	}
	if ($_POST['approve']) { 
	    foreach ($clear_checked as $key) { 
	        $sql = 'UPDATE `files` SET `active` = 1 WHERE `id` = ' . $key . ''; 
	    } 

	    foreach ($junk as $key) { 
	        $sql = 'UPDATE `files` SET `active` = 0 WHERE `id` = ' . $key . ''; 
	    } 
	} elseif ($_POST['archive']) { 
	    foreach ($clear_checked as $key) { 
	        $sql = 'UPDATE `files` SET `active` = 2 WHERE `id` = ' . $key . ''; 
	    } 

	    foreach ($junk as $key) { 
	        $sql = 'UPDATE `files` SET `active` = 0 WHERE `id` = ' . $key . ''; 
	    } 
	} elseif ($_POST['delete']) { 
	    foreach ($clear_checked as $key) { 
	        $sql = 'DELETE FROM `files` WHERE `id` = ' . $key . ''; 
	    } 

	    foreach ($junk as $key) { 
	        $sql = 'UPDATE `files` SET `active` = 0 WHERE `id` = ' . $key . ''; 
	    } 
	}
 
Код:
$qu = mysql_query("SELECT * FROM `files`, `cats` WHERE `files`.`cat_id`=`cats`.`id` AND `files`.`active`='0' ORDER BY `files`.`id` DESC") or die (mysql_error());
   echo '<form method="post" action="">';
   echo '<table>';
   while ($da = mysql_fetch_assoc($qu)) { 
       echo '<tr>
            <td><a href=' . $da['url'] . '>' . $da['title'] . '</a></td>
            <td>' . $da['uploader'] . '</td>
            <td>' . $da['cat_title'] . '</td>
            <td>' . $da['format'] . '</td>';
       echo '<td><input type="checkbox" name="allchecked[' . $da['id'] . ']"/></td>';
       echo '</tr>';
   }
   echo '</table>';
   echo '<input type="submit" name="approve" value="Удобри избраните"/>
         <input type="submit" name="archive" value="Прати в архив избраните"/>
         <input type="submit" name="delete" value="Изтрий избраните"/>
      </form>';

   $allchecked = $_POST['allchecked'];
   $clear_checked = array();
   $junk = array();
   foreach ($allchecked as $key => $check) {
      if (!empty($check)) {
         $clear_checked[$key] = $check;
      } else {
         $junk[] = $key;
      }
   }
   if ($_POST['approve']) {
       foreach ($clear_checked as $key => $checked) {
           $sql = 'UPDATE `files` SET `active` = 1 WHERE `id` = ' . $key . '';
       }

       foreach ($junk as $key => $checked) {
           $sql = 'UPDATE `files` SET `active` = 0 WHERE `id` = ' . $key . '';
       }
   } elseif ($_POST['archive']) {
       foreach ($clear_checked as $key) {
           $sql = 'UPDATE `files` SET `active` = 2 WHERE `id` = ' . $key . '';
       }

       foreach ($junk as $key => $checked) {
           $sql = 'UPDATE `files` SET `active` = 0 WHERE `id` = ' . $key . '';
       }
   } elseif ($_POST['delete']) {
       foreach ($clear_checked as $key => $checked) {
           $sql = 'DELETE FROM `files` WHERE `id` = ' . $key . '';
       }

       foreach ($junk as $key => $checked) {
           $sql = 'UPDATE `files` SET `active` = 0 WHERE `id` = ' . $key . '';
       }
   }

Виж това.
 
Е сега вече ме уби. Така преди
Код:
$allchecked = $_POST['allchecked'];
сложи
Код:
$allchecked = array()
Ако няма промяна, може да опиташ да разбиташ синтаксиса на заявката. Преди да тестваш отново се увери, че заявката ти връща някакви резултати, ако не огледай за свързване на 2 датабази. Нещо от рода на
Код:
$qu = mysql_query("SELECT * FROM `files` LEFT JOIN (`cats`) ON (`files`.`cat_id` = `cats`.`id`) WHERE `files`.`active` = '0' ORDER BY `files`.`id` DESC") or die (mysql_error());
, ако не се лъжа и тук имаше подобен урок.
 
g9m29 каза:
Е сега вече ме уби. Така преди
Код:
$allchecked = $_POST['allchecked'];
сложи
Код:
$allchecked = array()
Ако няма промяна, може да опиташ да разбиташ синтаксиса на заявката. Преди да тестваш отново се увери, че заявката ти връща някакви резултати, ако не огледай за свързване на 2 датабази. Нещо от рода на
Код:
$qu = mysql_query("SELECT * FROM `files` LEFT JOIN (`cats`) ON (`files`.`cat_id` = `cats`.`id`) WHERE `files`.`active` = '0' ORDER BY `files`.`id` DESC") or die (mysql_error());
, ако не се лъжа и тук имаше подобен урок.
Заявката ми връща резултати. Там всичко си е ок.
Дори и като сложих масива пак дава същата грешка.
 
Отново грешка, интересно, интересно. Значи грешката незнам до колко е в моя код, но като го гледам си е читав, по принцип, за да дава такава грешка има 2 причини, или взетите стойности не са масиви ( а стрингове логично ), или $allchecked, $key -> едната или и 2те стойности са null, можеш да направиш проверка с var_dump, за да видиш какво ти връща, и след това направи проверка дали масива има повече от 1 елемент ( не е стринг ) и си готов.
 
var_dump($allchecked, $key); вади NULL NULL преди да съм избрал опция.
Ако избера един запис и му дам да го удобри var_dump ми вади
array(2) { [1]=> string(2) "on" [3]=> string(2) "on" } int(3)
Едит: забравих да кажа, че не прави заявка към датабазата. Т.е. не удобрява файла.
 
Не беше нужно да правиш проверка и на 2те. Виж, че за изпълнението на заявката ни трябва само $allchecked, можеш съвсем спокойно да дадеш var_dump на $clear_checked последователно преди всеки foreach и да видиш къде се къса връзката, ако изобщо го прави някъде ( защото, щом вади стойност на масив значи няма грешка в кода ) ............... та общо взето направи проверките, ако си има навсякъде масивчета преди главния foreach сложи
Код:
if (is_array($allchecked)) { 
foreach ($allchecked as $key => $check) {
      if (!empty($check)) {
         $clear_checked[$key] = $check;
      } else {
         $junk[] = $key;
      } 
}
 

Back
Горе