使用带有大量输入的表单的绑定(PHP)

时间:2014-12-20 19:44:01

标签: php mysql mysqli bind

我有很多输入的表单,我正在尝试将它们导入数据库(mysql)。 我想使用bind但是试图避免多次写入所有变量。可能我无法解释这么好,所以我将在这里是一个代码

if(isset($_POST['firstName']) && isset($_POST['lastName']) && isset($_POST['gender'])){

    $firstName=trim($_POST['firstName']);
    $lastName=trim($_POST['lastName']);
    $gender=trim($_POST['gender']);

    if(!empty($firstName)&& !empty($lastName)) {
        $unos = $db->prepare("INSERT INTO members (firstName,lastName,gender) VALUES (?,?,?)");
        $unos->bind_param('sss', $firstName, $lastName, $gender);

        if($unos->execute()) {....

1.这个工作正常,这不是问题,但现在我想添加更多输入,所以我尝试了这个

if(isset($_POST['firstName']) && isset($_POST['lastName']) && isset($_POST['gender'])){

    $firstName=trim($_POST['firstName']);
    $lastName=trim($_POST['lastName']);
    $gender=trim($_POST['gender']);

    $param=array('$firstName','$lastName','$gender');
    $type='sss';
    $param_list = implode(',', $param);

    if(!empty($param)) {
        $unos = $db->prepare("INSERT INTO members (firstName,lastName,gender) VALUES (?,?,?)"); 
        $unos->bind_param($type,implode(',', $param));

        if($unos->execute()) {....

它不起作用。我得到“类型定义字符串中的元素数量与绑定变量数量不匹配”... 我不明白,因为当我回应这个内爆的东西时,我得到了我需要的东西。 我是PHP的新手,所以帮助将是如此珍贵。 :)

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

if(isset($_POST['firstName']) && isset($_POST['lastName']) && isset($_POST['gender'])){

    $firstName=trim($_POST['firstName']);
    $lastName=trim($_POST['lastName']);
    $gender=trim($_POST['gender']);

    $param=array('firstName' => 's','lastName' => 's','gender' => 's');

    if(!empty($param)) {
      $unos = $db->prepare("INSERT INTO members (". implode(',', array_keys($param) .") VALUES (". implode(',', array_fill(0, count($param), '?')) .")"); 
      foreach($param as $paramName => $paramType) {
          $unos->bind_param($paramType, $paramName);
      }


      if($unos->execute()) {....

您可以向$param数组推送尽可能多的参数。键应该是db列的名称,value是其类型。

答案 1 :(得分:0)

每个问号都需要一个变量,但您还需要分别绑定每个参数。在当前情况下,将逗号分隔的值列表绑定为单个字符串参数。

这个怎么样?我试图使整个代码依赖于单个字段数组。如果你想要额外的字段,你可以将它们添加到数组中,其余的代码应该响应它。我手边没有适当的测试环境而且我用心输入了这个代码,对于任何错别字都很抱歉。 :)

// The fixes list of allowed/expected fields. Other values are ignored.
$fields = array('firstname', 'lastname', 'gender');

// Check if each value exists, and put them in an array.
$paramvalues = array();
foreach ($fields as $field) do
{
  if (!isset($_POST[$field])) 
    die("missing field $field");

  $paramvalues[] = & $_POST[$field]; // Bind_param wants a ref value, hence `&`
}

// Build a list of fields for the dynamic query.
$fieldlist = implode($fields, ',');
// And a list of placeholders.
$paramlist = implode(array_fill(0, count($fields), '?'), ',');
// And a list of types, assuming all parameters are strings.
$paramtypes = str_pad('', count($fields), 's');

// Prepare the query
$unos = $db->prepare("INSERT INTO members ($fieldlist) VALUES ($paramlist)"); 

// Build an array of reference values to be passed to call_user_func_array:
$paramrefvalues = array();
$paramrefvalues[] = $paramtypes
foreach ($paramvalues as $value) do
{
  $paramrefvalues[] = & $value;
}

// Call bind_param using this array of by-ref parameters
call_user_func_array(array($unos, 'bind_param'), $paramrefvalues);

此代码基于this article