Autor Zpráva
Quicky
Profil
Dobrý den,

Mám problém s výpisem SQL/PHP. Mám vytvořenou databázi s tabulkou, v PHP udělaný výstup. Vše funguje. Nyní chci přidat ke každému řadku checkbox. Pak po zaškrtnutí a následném "submit" by se měl zobrazit pouze řádky co jsou zaškrtnuté. A to mi nefunguje.

Hledam jsem všude na netu, už to dělám dlouho, i na zahraničních webech a youtube. Zkoušel jsem i javascript. Mám pár pokusů za sebou,ale nemají ten správný výsledek.

Znáte někdo nějaký návod nebo článek co se stím zabývá? Nebo alespon nějaký simple příklad?
juriad
Profil
Quicky:
Každý checkbox bude mít name="idecka[]" a ve value obsahovat idečko záznamu v datábázi. Po odeslání formuláře najdeš v PHP pole $_GET['idecka']. Pak v SQL klauzuli WHERE id IN (...), doplníš místo tříteček čárkami oddělený seznam těch ideček.

Jelikož nemáme žádnou představu o tom, co zvládáš, bylo by dobré ukázat kus kódu, který jsi zkoušel a nefunguje. Možná jsi byl na správné cestě.
Quicky
Profil
juriad:
Tenhle pokud byl asi nejzdařilejší, Idečka se uloží a klidně i vypíšou,ale nejde mi vyhodit výsledek. 

$sql = "SELECT * FROM data";
$queryData = mysql_query( $sql); 
 
if (isset($_GET['vyber'])) {
 $multiple = $_GET['multiple'];

$sql = " SELECT * FROM data WHERE zakazka_id = " .mysql_real_escape_string($multiple) ."";
      
 }
 
                                  
 ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<head>  
<meta charset="UTF-8">

  <title>TISK</title>
    <link rel="stylesheet" href="../style.css" type="text/css">
</head>
  <body>
   <?php
    if (mysql_num_rows($queryData) > 0 ); 
      ?>
  <form action="#" method="GET">
   
       <table width="100%">
         
         <thead>
            <tr>
            <td>ID zakázky</td>
            <td>zakaznik ID</td>
            <td> <input type="submit" name="vyber" value="vybrat" > </td>
             </tr>
        </thead>
        
          <tbody> 
              <?php  while ($row = mysql_fetch_assoc($queryData)){  ?>
              
               <tr>
            <td><?php echo $row['zakazka_id']; ?> </td>
            <td><?php echo $row['zakaznik_id']; ?> </td>
            <td> <input type="checkbox" name="multiple[]" value="<?php echo $row['zakazka_id'] ?>" > </td>
                 
            
             </tr>
                <?php }  ?>
          </tbody>
       </table>
   </form>
</body>
</html>
juriad
Profil
Quicky:
To proto, že $multiple je pole a nikoli řetězec.

$multiple = [];
$clause = '';
if (isset($_GET['multiple']) && is_array($_GET['multiple'])) {
  foreach ($_GET['multiple'] as $id) {
    $multiple[] = (int) $id;
  }
  $clause = ' AND zakazka_id IN (' . implode(', ', $multiple)) . ')';
}

# to 1=1 je trik jak zajistit, že dotaz obsahuje WHERE podmínku a je k ní snadno možné něco přidat
$sql = 'SELECT * FROM data WHERE 1=1' . $clause;
Quicky
Profil
juriad:
Děkuji za radu.
jen to háže Parse error: syntax error, unexpected '[' na řádku s $multiple = [];
Keeehi
Profil
Asi používáš starou verzi PHP. [] nahraď za array()
Quicky
Profil
Ted je to tedy správně. Ale..
Pořád to dělá to samé. Idečka jso sice správně načtená,ale při ale zobrazuje se pořad celý výpis z databáze a ne jen ty zaškrtnuté. Někde musí být malá chybka.
Lonanek
Profil
Nechte si vypsat proměnnou $clause, nebo celý dotaz $sql.

juriad:
Je možno to také řešit bez použití "triku".
$multiple = []; // popr. array();
$clause = '';
if (isset($_GET['multiple']) && is_array($_GET['multiple'])) {
  foreach ($_GET['multiple'] as $id) {
    $multiple[] = (int) $id;
  }
  $clause = ' WHERE zakazka_id IN (' . implode(', ', $multiple)) . ')';
}
 
$sql = 'SELECT * FROM data' . $clause;
juriad
Profil
Quicky:
To proto, že
$queryData = mysql_query( $sql);
musíš zavolat až po přípravě proměnné $sql za uvedeným blokem kódu. To, co jsem uvedl v [#4], pokrývá oba případy, že byl i nebyl zvolený filtr.

Lonanek:
Vím, ale až bude chtít Quicky chtít přidat nějaký jiný filtr, bude to mít snažší.
Keeehi
Profil
juriad:
Chceš-li více filtrů pak
$conditions = [];

if (isset($_GET['multiple']) && is_array($_GET['multiple']) && !empty($_GET['multiple'])) {
  $multiple = [];
  foreach ($_GET['multiple'] as $id) {
    $multiple[] = (int) $id;
  }
  $conditions[] = 'zakazka_id IN (' . implode(', ', $multiple)) . ')';
}

if(/*something*/) {
    $conditions[] = "foo = 'bar'";
}

$condition = "";
if (!empty($conditions)) {
    $condition = " WHERE ".implode(" AND ", $conditions);
}

$sql = 'SELECT * FROM data' . $condition;
Quicky
Profil
Děkuji mnohokrát pánové. Povedlo se! Jste výborní

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: