-1

我一直试图让这段代码插入到我的表单中,但我不断收到一个又一个错误。我对此束手无策,需要帮助。我是 php 和 pdo 的新手,因此我们将不胜感激。我已经搜索了这个论坛并阅读了一些关于这个问题的书籍,我的知识和理解仍然有限,但这里是我得到的错误和代码。

解析错误:语法错误,第 1455 行 C:\xampp\htdocs\Rental Form\testdb04.php 中的意外 '=>' (T_DOUBLE_ARROW)

<?php

if (isset($_POST['submit'])){   
$config = array(    
    'host' => 'localhost',
    'username' => 'root',
    'password' => '',
    'dbname' => 'rentalform'
);  

    $db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['dbname'], $config['username'], $config['password']);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


$filterType = array( 'string' => FILTER_SANITIZE_STRING | FILTER_SANITIZE_STRIPPED,);


        $post = array();
foreach($_POST as $key => $value) {
    $filter = $filterType[gettype($value)];
    $value = filter_var($value, $filter);
    $post[$key] = $value;
}
$bindValues = $post;


$tenant = implode(',', array_keys($bindValues));
$values = implode(',:', array_keys($bindValues));


$stmt = $db->prepare("INSERT INTO rental_form ($tenant) VALUES (:$values)");

foreach($bindValues as $key => $value) {
    $stmt->bindValue(':' . $key, $value, PDO::PARAM_STR);
}

$stmt->execute();

//echo '<pre>'.var_dump("INSERT INTO rental_form ($tenant) VALUES (:$values)").'</pre>';

/*echo "INSERT INTO rental_form ($tenant) VALUES (:$values)";*/
/*for ($i=0, $c=count($filterType); $i<$c; $i++) {
    echo $filterType[$i];
}*/
}
?>
</body>
</html> 
4

1 回答 1

0

语法错误可能$post[$key] => $value;是应该使用等号而不是像这样的双箭头:$post[$key] = $value;

但是您还应该注意Nanne关于删除单引号的评论,'$_POST[tenant_lname]'因为即使它没有给出语法错误,它仍然会为数组键名提供错误的值,它将是字符串$_POST[tenant_lname]而不是带有那个的值钥匙。

更新 1)要摆脱通知,请if isset在分配中添加如下:

foreach($_POST as $key => $value) {
    if (isset($filterType[gettype($value)])) 
    {
       $filter = $filterType[gettype($value)];
       $value = filter_var($value, $filter);
    }
    $post[$key] = $value;
}

2)回声证实了我认为的问题是合并$bindValues并且$post给出了$bindValues不一致的键类型(整数和字符串)。合并的目的是什么?因为我认为这就是弄乱 INSERT 语句的原因。原始值是否$bindValues始终与 中的键相同$_POST?从回声来看,他们似乎是。因此,如果是,请尝试以下操作:

$tenant = implode(',', array_keys($post));
$values = implode(',:', array_keys($post));

更新2

好的,现在事情已经很清楚了。所以我提到的问题在那个链接中实际上是正确的,但没有正确地翻译成你的代码,这就是你遇到问题的原因。

1)$bindValues在链接中实际上与您的格式不同,它被初始化为$key => $value您刚刚拥有的$key. 该链接使用它是因为它们有一些带有手动值的键。由于您的值完全在 $_POST 中,因此您实际上不需要$bindValues, 仅$post.

2)您使用$filterType不正确。它意味着将实际的 PHP 数据类型作为键,因此您实际上只需要该数组中的一条记录,键为“字符串”。

您的代码实际上应该如下所示:

<?
  if (isset($_POST['submit'])) {   
    $config = array( 'host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'rentalform' );  

    $db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['dbname'], $config['username'], $config['password']);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $filterType = array( 'string' => FILTER_SANITIZE_STRING | FILTER_SANITIZE_STRIPPED );

    $post = array();
    foreach($_POST as $key => $value) {
        $filter = $filterType[gettype($value)];
        $value = filter_var($value, $filter);
        $post[$key] = $value;
    }
    $bindValues = $post;

    $tenant = implode(',', array_keys($bindValues));
    $values = implode(',:', array_keys($bindValues));

    $stmt = $db->prepare("INSERT INTO rental_form ($tenant) VALUES (:$values)");

    foreach($bindValues as $key => $value) {
        $stmt->bindValue(':' . $key, $value, PDO::PARAM_STR);
    }

    echo "INSERT INTO rental_form ($tenant) VALUES (:$values)";
    $stmt->execute();
  }
?>

让我知道这给了你什么。

于 2013-11-07T08:54:28.417 回答