创建动态call_user_func_array

时间:2018-03-10 22:23:11

标签: php

我正在尝试根据搜索表单上的哪些字段(主要是复选框)创建动态搜索查询。该表单最多包含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>';
}

2 个答案:

答案 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)

好的,首先,非常感谢你。它的工作原理很棒。我注意到的一些事情并不太确定如何修改。

  1. $ _Post字段名称必须与数据库/表列名称匹配。如果不知道列名,我认为这是很好的安全性。我不是那么精明,所以我很可能是错的。

  2. 我看到&amp; $ _ POST [$ value]的使用位置。现在,作为初学者,我通常将所有$ _Post数据直接放到变量中。也许是我的经验不足或固执,但我把信息放到变量上以保持原始的$ _Post不变,过滤等变量。从它的外观来看,我做不到。

  3. 必须手动构建变量$ allPossibleFields(array)和$ fieldsDatatypes(array)。作为一个例子,我尝试将可能的字段类型一起添加到1个变量中并插入代替('1','1','1')部分并将其删除。

  4. 我疯了吗?太挑剔了?我只想要一个表单,并根据用户点击的搜索字段然后填充到字符串中并对我的数据库/表运行。