user2912589
user2912589

Reputation:

fetch PDO::FETCH_ASSOC multiple checkboxes

usually i help people with whatever they need, this time i'm asking for your help.

i'm trying to get a specific row from my database after preforming multiple checkbox select i spend 50 hours on that and i couldn't manage to do that. each time i'm changing something in my code i get a different ERROR. i was looking for an answer in every HTML page that exist on the INTERNET !

please show me the light..

here is a part of my form.... value means "size" of the toy

    <div class=""><input type="checkbox" name="toys[]" value="6X2" /><label></label></div>
    <div class=""><input type="checkbox" name="toys[]" value="4X3" /><label></label></div>
    <div class=""><input type="checkbox" name="toys[]" value="8X2.5" /><label></label></div></strike>

here is the PHP code...

  if (isset($_POST['toys'])) {

     foreach($_POST['toys'] as $each_check) {

      }
  }

  $query = $db->query = 'SELECT * FROM `toys` WHERE SIZE = '.$each_check;   


echo "<table>";
    echo "<tr>
            <th>ratio</th>
            <th>size</th>
            <th>built</th>
            <th>description</th>            
          </tr>";



while ($row = $query->fetch(PDO::FETCH_ASSOC)) 

        echo "<tr><td>" . $row['ratio'] .
            "</td><td>" . $row['size'] .
            "</td><td>" . $row['built'] .
            "</td><td>" . $row['description'] .
            "</td></tr>";
echo "</table>";        

Upvotes: 0

Views: 743

Answers (4)

kDjakman
kDjakman

Reputation: 116

Hagay, the following should work for you:

$pdo = new PDO('mysql:host=localhost;dbname=mydatabase', 'my_name', 'my_pass');

if (isset($_POST['toys'])) {
    $sizes = implode(', ', array_map(array($pdo, 'quote'), $_POST['toys']));

    $sql = "SELECT * FROM toys WHERE size IN (" . $sizes . ")";

    echo '<table>', PHP_EOL;
    echo '<tr><th>ratio</th><th>size</th></tr>', PHP_EOL;

    foreach( $pdo->query($sql) as $row ) {
       echo '<tr><td>', $row['ratio'], '</td><td?', $row['size'],  '</td></tr>', PHP_EOL;
    }

    echo '</table>', PHP_EOL;
}

Upvotes: 0

kDjakman
kDjakman

Reputation: 116

I want to suggest that you use MySQL's IN (...) clause in your WHERE condition to retrieve all the rows with matching 'size' in just 1 query:

SELECT * FROM toys WHERE size IN ( $chosenSizes )

To get the list of sizes, use PHP's implode function:

$chosenSizes = implode(', ', $_POST['toys']);

You can then use PDO's fetchAll to fetch all rows into a result array.

$resultRows = $sth->fetchAll();

Note: Only use this method when you are quite certain that the result arrays is not too big!

Upvotes: 0

Sammitch
Sammitch

Reputation: 32272

This is so very far from being valid:

if (isset($_POST['toys'])) {

    foreach($_POST['toys'] as $each_check) {

    }
}

$query = $db->query = 'SELECT * FROM `toys` WHERE SIZE = '.$each_check;

More like:

if (isset($_POST['toys'])) {
    foreach($_POST['toys'] as $each_check) {
        $query = $db->query("SELECT * FROM `toys` WHERE SIZE = '".$each_check."'");
    }
}

But should be more like:

if (isset($_POST['toys'])) {
    $query = 'SELECT * FROM `toys` WHERE SIZE = ?';
    $sth = $db->prepare($query);
    foreach($_POST['toys'] as $each_check) {
        if( ! $sth->execute(array($each_check)) ) {
            die('MySQL Error: ' . var_export($sth->error_info(), TRUE);
        }
        while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
            // code here
        }
    }
}

Upvotes: 2

aynber
aynber

Reputation: 23000

You're assigning $db->query instead of using it as a function. Change your query line to this:

$query = $db->prepare('SELECT * FROM `toys` WHERE SIZE = :size');
$query->bindValue(':size',$each_check);
$query->execute();

Also, you're going through $_POST['toys'], but not assigning it to any value. I'm guessing you want to add all of your query and table code within the foreach.

if (isset($_POST['toys'])) {
    foreach($_POST['toys'] as $each_check) {
        // put everything else here
    }
}

Upvotes: 0

Related Questions