将所有0或全1插入数据库

时间:2011-07-20 19:12:48

标签: php

我有以下代码,几乎可以使用:

<?php
    if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
        $fields = array(
            'col1'  => 'cb1', 
            'col2'  => 'cb2', 
            'col3'  => 'cb3', 
            'col4'  => 'cb4', 
            'col5'  => 'cb5',
            'col6'  => 'cb6', 
            'col7'  => 'cb7', 
            'col8'  => 'cb8', 
            'col9'  => 'cb9', 
            'col10' => 'cb10'
        );

        $parts = array();

        foreach( $fields as $dbfield => $field ) {
            $parts[] = '`' . $dbfield . '` = :' . $dbfield;
        }

        $dbh = new PDO( 'mysql:host=localhost;dbname=database', 'user', 'pass' );
        $dbh -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

        $sth = $dbh -> prepare( 'UPDATE `table1` SET ' . join( ', ', $parts ) . ' WHERE `id` = :id' );

        // temp simulation value
        $id = 1;

        $sth -> bindParam( ':id', $id, PDO::PARAM_INT, 4 );

        foreach( $fields as $dbfield => $field ) {

            $value = isset( $_POST[$field] ) ? 1 : 0;
            $sth -> bindParam( ':' . $dbfield, $value, PDO::PARAM_INT, 4 );

        }

        $sth -> execute();

        $dbh = null;
    }
?>

<html>
    <head>
        <title></title>
    </head>

    <body>
        <form method="post">

            <input type="checkbox" name="cb1" /><br />

            <input type="checkbox" name="cb2" /><br />

            <input type="checkbox" name="cb3" /><br />

            <input type="checkbox" name="cb4" /><br />

            <input type="checkbox" name="cb5" /><br />

            <input type="checkbox" name="cb6" /><br />

            <input type="checkbox" name="cb7" /><br />

            <input type="checkbox" name="cb8" /><br />

            <input type="checkbox" name="cb9" /><br />

            <input type="checkbox" name="cb10" />

            <input type="submit" value="save" />

        </form>
    </body>
</html>

它应该插入0或1,具体取决于所选的复选框,但由于某种原因,无论选择哪个复选框,它都会将0插入所有列。但是,如果选中了最后一个复选框,则会在所有列中插入1。

2 个答案:

答案 0 :(得分:3)

bindParam绑定实际变量$value(通过引用),在循环结束时,它具有基于$_POST['cb10']的值。 (回想一下,PHP没有块作用域,因此只有一个$value变量,而不是每个循环迭代一个。)

我认为您打算使用bindValue

看一看the documentation

  

bool PDOStatement :: bindParam(混合$参数,混合&amp; $变量[,   int $ data_type = PDO :: PARAM_STR [,int $ length [,mixed   $ driver_options]]])

     

bool PDOStatement :: bindValue(混合$参数   ,混合$ value [,int $ data_type = PDO :: PARAM_STR])

答案 1 :(得分:0)

此更改应该可以解决问题

 foreach( $fields as $dbfield => $field ) {
        $parts[] = '`' . $dbfield. '` = :' . $_POST[$field];
    }