好吧,所以我正在尝试进行一个查询,在查询表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
有人可以帮我解决这个问题。
答案 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列的数据库表并不是一个好的做法,这些列具有类似的用途。相反,您应该规范化数据库,并将这些值放在行而不是列中。