我正在尝试根据搜索表单上的哪些字段(主要是复选框)创建动态搜索查询。该表单最多包含10个搜索字段。如果用户完全单击3个特定字段,则以下脚本可以正常工作。如果用户点击3以外的任何内容,它就不起作用。我知道它基于$ param数组,但是如果用户选择不同数量的搜索字段,我该如何使其动态化。它可能不漂亮,但我的工作。对不起,还在学习。
// Validating and filtering already done.
// Populate for testing purposes. . Assign variables from the search form
$formdata01 = 5;
$formdata02 = 1;
$formdata03 = 1;
...
$mybinder01 = 'i';
$mybinder02 = 'i';
$mybinder03 = 'i';
...
// Cols to display
$tablecols = 'tblcol01, tblcol02, tblcol04, tblcol05, tblcol06, tblcol07, tblcol08, tblcol09, tblcol10 ';
// Placeholders
$myholder01 = 'tblcol04 = ?';
$myholder02 = ' AND tblcol05 = ?';
$myholder03 = ' AND tblcol06 = ?';
...
// combine the placeholders together
$myholder99 = $myholder01.$myholder02.$myholder03;
// Combine the bind parameters
$mybinder99 = $mybinder01.$mybinder02.$mybinder01;
// The sql query
$mysql = "SELECT $tablecols FROM userdata WHERE $myholder99";
echo '<br>';
echo '<br>';
// Prepare the query
$stmt = $mysqli->prepare( $mysql );
// Create the bind parameters
$param = array($mybinder99, &$formdata01, &$formdata02, &$formdata02);
call_user_func_array(array($stmt, 'bind_param'), $param);
$stmt->execute();
// Execute it
$stmt->execute();
// Get results
$result = $stmt->get_result();
// Get number of rows returned
$returned = $result->num_rows;
// Check if returned is greater than 0
if ( $returned > 0 )
{
while( $row = mysqli_fetch_assoc( $result ) )
{
$test_col01 = $row['tblcol01'];
$test_col02 = $row['tblcol02'];
$test_col03 = $row['tblcol04'];
$test_col04 = $row['tblcol05'];
$test_col05 = $row['tblcol06'];
$test_col06 = $row['tblcol07'];
echo 'FOUND col01 data is: '. $test_col01;
echo '<br>';
echo 'FOUND col02 data is: '. $test_col02;
echo '<br>';
echo 'FOUND col04 data is: '. $test_col04;
echo '<br>';
echo 'FOUND col05 data is: '. $test_col05;
echo '<br>';
echo 'FOUND col06 data is: '. $test_col06;
echo '<br>';
echo 'FOUND col07 data is: '. $test_col07;
echo '<br>';
echo '<br>';
echo '<br>';
}
}
else
{
echo 'NO Records were found.';
echo '<br>';
}
答案 0 :(得分:0)
你几乎完成了它只需要动态创建绑定数组。 即这部分
public class ShoppingMain{
public static void main(String[] args) {
Catalog list = new Catalog("CS Gift Catalog");
list.add(new Item("silly putty", 3.95, 10, 19.99));
list.add(new Item("silly string", 3.50, 10, 14.95));
list.add(new Item("bottle o bubbles", 0.99));
list.add(new Item("Nintendo Wii system", 389.99));
list.add(new Item("Mario Computer Science Party 2 (Wii)", 49.99));
list.add(new Item("Don Knuth Code Jam Challenge (Wii)", 49.99));
list.add(new Item("Computer Science pen", 3.40));
list.add(new Item("Rubik's cube", 9.10));
list.add(new Item("Computer Science Barbie", 19.99));
list.add(new Item("'Java Rules!' button", 0.99, 10, 5.0));
list.add(new Item("'Java Rules!' bumper sticker", 0.99, 20, 8.95));
ShoppingFrame f = new ShoppingFrame(list);
f.setVisible(true);
}
}
但既然你告诉过你是初学者,请让我用一个例子来解释
假设我有5个文本框,其中前4个用于数字,最后一个用于字符串输入,与表中的matchig数据类型相对应
// Create the bind parameters
$param = array($mybinder99, &$formdata01, &$formdata02, &$formdata02);
有时用户可能只为其他几个字段提供价值,因为我们可能事先不知道我们需要绑定多少字段,这就是为什么我们使用<input type="text" name="tblcol01">
<input type="text" name="tblcol02">
<input type="text" name="tblcol03">
<input type="text" name="tblcol04">
<input type="text" name="tblcol05">
部分你
得到正确
现在,下一部分将查看call_user_func_array()
并确定用户提供的字段,我们需要绑定。
$_POST
答案 1 :(得分:0)
好的,首先,非常感谢你。它的工作原理很棒。我注意到的一些事情并不太确定如何修改。
$ _Post字段名称必须与数据库/表列名称匹配。如果不知道列名,我认为这是很好的安全性。我不是那么精明,所以我很可能是错的。
我看到&amp; $ _ POST [$ value]的使用位置。现在,作为初学者,我通常将所有$ _Post数据直接放到变量中。也许是我的经验不足或固执,但我把信息放到变量上以保持原始的$ _Post不变,过滤等变量。从它的外观来看,我做不到。
必须手动构建变量$ allPossibleFields(array)和$ fieldsDatatypes(array)。作为一个例子,我尝试将可能的字段类型一起添加到1个变量中并插入代替('1','1','1')部分并将其删除。