在数组

时间:2016-03-03 19:32:00

标签: php mysql

好吧,所以我正在尝试进行一个查询,在查询表PRIV中查找在=是或否的复选框中选择的任何列。

这是代码。

if(isset($_POST['submit']))
    {       
        $fini = $_POST['chk'];
        $fila = $_POST['ends'];
        $qMarks = str_repeat('?,', count($fini) - 1) . '?';
        $stmt = $con->prepare("SELECT * FROM priv WHERE `$qMarks` = `$fila`");
        $stmt->execute($fini);
        while($myR=$stmt->fetch(PDO::FETCH_ASSOC))
        {
            echo $myR['ident'];
            echo "<br>";    
        }
    }

正如您所看到的,$ fini表示选中的数组形式的复选框.. $ fini中可能的数字是op1,op2一直到op24

$ fila代表一个简单的Yes或No Selector ..

例如..如果我选择复选框2和3,那么$ fini数组将是op2,op3,如果我在选择器上选择启用,则$ fila将为是

这是我得到的错误。

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column ''op1'' in 'where clause'' in 

它说的是未知的列op1 ..这没有任何意义,因为我有列op1 - op24

有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

错误消息显示正在查找'op1'列(带引号),这显然不存在。引号是因为您将这些值作为字符串参数传递。

但那可能永远不会奏效。参数旨在传递文字值,而不是列名。

你想做的事情并不适合参数。相反,我会建议以下代码。评论应该澄清每一步:

// Generate array of valid column names
$columns = array_map(function ($i) { return "op$i"; }, range(1,24));

// Ensure the provided data is acceptable -- remove what is not:
$fila = $_POST['ends'] == 'Yes' ? 'Yes' : 'No'; // only Yes or No are allowed
$fini = array_intersect($columns, $_POST['chk']); // only real column names are allowed

// You need to treat the case when no checkboxes are checked: 
if (count($fini) == 0) die("You need to check at least one checkbox.");

// Make $fila also an array with just as many elements as $fini, and wrap 
// each value (Yes or No) in quotes:
$fila = array_fill(0, count($fini), "'$fila'");

// turn both arrays into comma-separated strings, and compare tuples
$sql = "SELECT * FROM priv 
        WHERE (" . implode(',', $fini) . ") = (" . implode(',', $fila) . ")";

$stmt = $con->prepare($sql);
$stmt->execute(); // no parameters
// ... etc...

考虑

设计具有24列的数据库表并不是一个好的做法,这些列具有类似的用途。相反,您应该规范化数据库,并将这些值放在行而不是列中。