Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于php中的预处理语句,这种编码正确吗?我有一张有多个帖子的表格?_Php_Mysql_Arrays_Forms_Pdo - Fatal编程技术网

对于php中的预处理语句,这种编码正确吗?我有一张有多个帖子的表格?

对于php中的预处理语句,这种编码正确吗?我有一张有多个帖子的表格?,php,mysql,arrays,forms,pdo,Php,Mysql,Arrays,Forms,Pdo,我一直试图让这段代码插入到我的表单中,但我不断地遇到一个又一个错误。我对此束手无策,需要帮助。我是php和pdo新手,因此非常感谢您的帮助。我已经搜索了这个论坛,阅读了一些关于这个问题的书籍,我的知识和理解仍然有限,但这里是我得到的错误和代码 分析错误:语法错误,在C:\xampp\htdocs\Rental Form\testdb04.php的第1455行出现意外的“=>”(T_双箭头) <?php if (isset($_POST['submit'])){ $config =

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

分析错误:语法错误,在C:\xampp\htdocs\Rental Form\testdb04.php的第1455行出现意外的“=>”(T_双箭头)

<?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> 

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

但是,您还应该注意关于从
'$\u POST[tenant\u lname]
中删除单引号的注释,因为即使它没有给出语法错误,它仍然会为数组键名提供错误的值,它将是字符串
$\u POST[tenant\u lname]
,而不是带有该键的值

更新 1) 要删除通知,请在作业中添加一个
(如果设置了
),如下所示:

$tenant = implode(',', array_keys($post));
$values = implode(',:', array_keys($post));
2) echo确认了我认为存在的问题,即合并
$bindValues
$post
会产生
$bindValues
不一致的键类型(整数和字符串)。合并的目的是什么?因为我认为这就是造成INSERT语句混乱的原因。原始
$bindValues
中的值是否始终与
$\u POST
中的键相同?从回声上看,他们似乎是。因此,如果是,请尝试以下方法:

<?
  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();
  }
?>
更新2

好了,事情已经很清楚了。因此,我提到的问题在该链接中实际上是正确的,但没有正确地转换为代码,这就是为什么会出现问题

1) 链接中的
$bindValues
的格式实际上与您的格式不同,它被初始化为
$key=>$value
,而您只有
$key
。链接使用它是因为他们有一些带有手动值的键。由于您的值完全在$\u POST中,因此实际上不需要
$bindValues
,只需要
$POST

2) 您使用的
$filterType
不正确。这意味着要将实际的PHP数据类型作为键,所以实际上在该数组中只需要一条带有键“string”的记录

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



让我知道这会给您带来什么。

这个问题无法回答,因为它无法阅读。您希望修复语法错误(请告诉我们该行号是什么?),还是需要pdo方面的帮助?可能至少是第一个:这只是你有一个语法错误。我想说多个(即
“$\u POST[tenant\u lname]“
不太好。请先进行一些调试。Echo/var\u转储您的东西,检查是否所有内容都符合您的要求,检查您的IDE以获取有关您在何处创建类型的提示/遗漏了一个
等@Nane var\u转储的哪些字段哪一行是第1455行?您在这里说的不完全清楚。我更改了“$\u POST[tenant\u lname]'至$邮政[租户名称]并收到以下错误:注意:在C:\xampp\htdocs\Rental Form\testdb04.php的第1298行使用未定义的常量tenant\u lname-假定“tenant\u lname”也得到以下内容:注意:未定义的索引:在C:\xampp\htdocs\Rental Form\testdb04.php的第1453行中字符串1453行的行是$filter=$filtertertype[gettype($value)];窗口底部的错误读取:致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在C:\xampp\htdocs\Rental Form\testdb04.php:1470堆栈跟踪:#0 C:\xampp\htdocs\testdb04.php:1470堆栈跟踪:#0 C:\xampp\htdocs\\出租表单\testdb04.php(1470):PDOStatement->execute()#1{main}在C:\xampp\htdocs\Rental Form\testdb04.php联机时抛出1470@Nanne我的实际表单位于所有php编码之上。我不确定是否发布整个表单或只是其中的一部分,因此,我只发布了php代码。如果这还不够,请告诉我您是否需要查看整个表单。超过1500行的表单是($post=array()的变量转储;注意:未定义的索引:C:\xampp\htdocs\rent Form\testdb04.php中的字符串在第1457行数组(152){[“tenant\u lname”]=>bool(false)[“tenant\u fname”]=>bool(false)[“tenant\u mname”]=>bool(false)[“dl\u number”]=>bool(false)[“dl\u state”]=>bool(false)[“dl\u state”]=>bool(false)[“生日”]=>bool(false)[][“tenant_wphone”]=>bool(false)[“tenant_wphone”]=>bool(false)[“curr_street”]=>bool(false)[“curr_unit”]=>bool(false)[“curr_city”]=>bool(false)[“curr_state”]=>bool(false)没有注意到索引名周围没有单引号。应该是
$\u POST['tenant_lname']
。让我们知道在这之后你还会遇到什么错误。
<?
  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();
  }
?>