以下代码中存在错误。
demo.php:
<form method="post" action="">
<table border="1">
<tr>
<td> Enter Name </td>
<td> <input type="text" name="txtname"/> </td>
</tr>
<tr>
<td> Enter Email </td>
<td> <input type="text" name="txtemail" /> </td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" name="btnsubmit" value="Add" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<?php
if(isset($_REQUEST['message']))
{
echo $_REQUEST['message'];
}
?>
</td>
</tr>
</table>
</form>
<?php
include 'db_operations.php';
if(isset($_POST['btnsubmit']) and isset($_POST['btnsubmit']) == "Add")
{
extract($_POST);
$insertQuery = "INSERT INTO author(name,email) VALUES (?,?)";
$param_type = "ss";
$param = $txtname.','.$txtemail;
$result = $db->executeQuery('insert',$insertQuery,$param_type,$param);
header("Location:demo.php?message=$result");
}
?>
db_operations.php:
<?php
function executeQuery($query_type,$query_string,$param_type,$param)
{
$result = "Error";
set_error_handler("logError");
if(!$stmt = $this->con->prepare($query_string))
{
trigger_error("Failed to prepare statement for " . $query_type ." query");
}
if(!$stmt->bind_param($param_type,$param))
{
trigger_error("Failed to bind parameter for " . $query_type ." query");
}
if(!$stmt->execute())
{
trigger_error("Failed to execute " . $query_type ." query");
}
else
{
$result = "Record ".$query_type."ed successfully";
}
$this->stmt->close();
$this->con->close();
return $result;
}
?>
有2个php文件。第一个脚本接受记录并进行插入查询,第二个脚本执行该查询。
但是,当我执行程序时,它会显示以下错误:
*错误类型:E_WARNING *错误字符串:mysqli_stmt :: bind_param():类型定义字符串中的元素数量与匹配变量数量不匹配 *错误行:55 *错误文件:F:\ wamp \ www \ food_app \ inc \ admin_db_operations.php *错误日期:09-02-2018 06:43:09 pm
*错误类型:E_USER_NOTICE *错误字符串:无法绑定插入查询的参数 *错误行:57 *错误文件:F:\ wamp \ www \ food_app \ inc \ admin_db_operations.php *错误日期:09-02-2018 06:43:09 pm
*错误类型:E_USER_NOTICE *错误字符串:无法执行插入查询 *错误行:61 *错误文件:F:\ wamp \ www \ food_app \ inc \ admin_db_operations.php *错误日期:09-02-2018 06:43:09 pm
请指导我如何改进我的功能才能正常工作。
答案 0 :(得分:1)
好吧,根据错误消息:
类型定义字符串中的元素数量与绑定变量数量
不匹配
您指定的变量数量与您提供的数量不同。让我们来看看绑定值的位置:
$stmt->bind_param($param_type,$param)
您正在传递字符串"ss"
,表示有两个要绑定的参数。但是,您只在$param
中传递了一个值。该值是由您想要的两个不同值组成的单个字符串。
您必须单独绑定值,而不是单个字符串。
bind_param()
函数需要可变数量的参数。所以你应该能够在你的函数中传递相同的概念。它已经有一段时间了,但我认为它可能看起来像这样:
function executeQuery($query_type, $query_string, $param_type, ...$params)
...
会告诉PHP $params
是variable-length argument list。然后我想你可以将该列表传递给bind_param()
:
$stmt->bind_param($param_type, $params)
当你调用你的函数时,不是将你的值连接成一个字符串,而是将它们作为单独的值传递:
$db->executeQuery('insert', $insertQuery, $param_type, $txtname, $txtemail)
答案 1 :(得分:1)
在这部分代码中:
$insertQuery = "INSERT INTO author(name,email) VALUES (?,?)";
$param_type = "ss";
$param = $txtname.','.$txtemail;
这一行错了:
$param = $txtname.','.$txtemail;
为什么呢?因为你只是在1中转换2个变量。然后当你尝试绑定参数时,你会得到你的描述中提到的错误,因为查询期望2个参数不是1.如果你的想法是通过这个参数“all-in-one “你可以创建一个数组:
//$param = $txtname.','.$txtemail; // this line is wrong
$param = array($txtname, $txtemail); // This line is correct!
然后,您更改代码中“绑定”值的方式,更改此代码:
if(!$stmt->bind_param($param_type,$param))
{
trigger_error("Failed to bind parameter for " . $query_type ." query");
}
这个:
if(!$stmt->bind_param($param_type,$param['0'],$param['1']))
{
trigger_error("Failed to bind parameter for " . $query_type ." query");
}
此处有关绑定参数的更多信息:mysqli stmt bind以及您可以在此处使用数组的方式:PHP Arrays
答案 2 :(得分:-1)
首先,您的PHP代码都不会运行,因为您的条件包括:
isset($_POST['btnsubmit']) == "Add"
虽然你肯定意味着
$_POST['btnsubmit'] == "Add"
因为isset()
的结果可能是true
或false
,但肯定不是"Add"
第二个你的$param
变量应该是这样的数组:
$param = [$txtname, $txtemail];
因为现在,您只传递了一个参数,该参数由一个中间有逗号但仍然只有一个字符串的字符串组成,这样就可以填充查询中的第一个?
,MySQL
正在等待第二个参数。这是WARNING
所说的