Php MySQLi prepare语句失败,错误为:致命错误:对非对象调用成员函数bind_param()
我更新了这个问题以进一步澄清 这是我第一次处理MySQLi插入。我一直使用MySQL并直接运行查询。显然,没有MySQLi那么安全 无论如何,我试图将两个变量传递到数据库中。由于某种原因,我事先准备好的声明没有起到任何作用 编辑:现在可以工作了www!!!!我在wayyyy中添加了更多错误检查。进行了一些研究,但在每个函数中添加了检查。这样我就可以找到与正确函数对应的错误代码。再次感谢你的帮助。如果没有你,我肯定不会这么做。下面列出的代码现在是工作代码Php MySQLi prepare语句失败,错误为:致命错误:对非对象调用成员函数bind_param(),php,mysql,mysqli,Php,Mysql,Mysqli,我更新了这个问题以进一步澄清 这是我第一次处理MySQLi插入。我一直使用MySQL并直接运行查询。显然,没有MySQLi那么安全 无论如何,我试图将两个变量传递到数据库中。由于某种原因,我事先准备好的声明没有起到任何作用 编辑:现在可以工作了www!!!!我在wayyyy中添加了更多错误检查。进行了一些研究,但在每个函数中添加了检查。这样我就可以找到与正确函数对应的错误代码。再次感谢你的帮助。如果没有你,我肯定不会这么做。下面列出的代码现在是工作代码 <?php error_report
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
function InsertIPs($decimnal,$cidr)
{
$mysqli = new mysqli("localhost","jeremysd_ips","","jeremysd_ips");
if(mysqli_connect_errno())
{
echo "Connection Failed: " . mysqli_connect_errno();
exit();
}
$stmt = $mysqli->prepare("INSERT INTO subnets VALUES ('',?,?,'1','','0','0','0','0','0', '', '0', '0', NULL)");
if( false===$stmt ){
die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}
$rc = $stmt->bind_param('ii',$decimnal,$cidr);
if( false===$rc ){
die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}
$rc=$stmt->execute();
if( false===$rc ){
die('execute() failed: ' . htmlspecialchars($mysqli->error));
}
printf("%d Row inserted.\n", $stmt->affected_rows);
$stmt->close();
$mysqli -> close();
}
$SUBNETS = array ("2915483648 | 18");
foreach($SUBNETS as $Ip)
{
list($TempIP,$TempMask) = explode(' | ',$Ip);
echo InsertIPs($TempIP,$TempMask);
}
?>
查看您的纯查询:
"INSERT INTO subnets
(id, subnet, mask,sectionId,description,vrfld,masterSubnetId,allowRequests,vlanId,showName,permissions,pingSubnet,isFolder,editDate)
VALUES
('',?,?,'1','','0','0','0','0','0', '{'3':'1','2':'2'}', '0', '0', NULL)"
有逗号的'{'3':'1','2':'2'}'是什么?是否应该重新格式化以使MySQL查询不会阻塞它?这些值是否应按如下方式转义:
'{\'3\':\'1\',\'2\':\'2\'}'
$raw_query = "INSERT INTO subnets (id, subnet, mask, sectionId, description, vrfld, masterSubnetId, allowRequests, vlanId, showName, permissions, pingSubnet, isFolder, editDate)
VALUES ('',?,?,'1','','0','0','0','0','0',?, '0', '0', NULL)";
if($stmt = $mysqli -> prepare($raw_query))
{
$stmt-> bind_param('ii',$decimnal,$cidr,$cidr,'{"3":"1","2":"2"}');
或者使用“
,因为您现在似乎表示需要双引号
'{\"3\":\"1\",\"2\":\"2\"}'
因为单引号和逗号混在一起似乎有问题
或者另一种解决方案是将该值绑定到查询,如下所示:
'{\'3\':\'1\',\'2\':\'2\'}'
$raw_query = "INSERT INTO subnets (id, subnet, mask, sectionId, description, vrfld, masterSubnetId, allowRequests, vlanId, showName, permissions, pingSubnet, isFolder, editDate)
VALUES ('',?,?,'1','','0','0','0','0','0',?, '0', '0', NULL)";
if($stmt = $mysqli -> prepare($raw_query))
{
$stmt-> bind_param('ii',$decimnal,$cidr,$cidr,'{"3":"1","2":"2"}');
错误消息是什么?上90%的PHP/MySQL查询不必检查其MySQL调用的返回状态,当他们这样做时,他们不会检查错误消息。如果您检查MySQL提供的错误消息,您可能已经知道这里出了什么问题。@Fred ii-最后一条评论不正确。这些变量很好,请仔细查看”因为它们需要在数据库中显示为:{“3”:“1”,“2”:“2”}”-下面是您的答案:使用{“3\”:\“1\”,\“2\”}
它将显示为{“3”:“1”,“2”:“2”}
在DB中。至少对我来说是这样。@Jimmy还有一个基本的编码真理是,在将概念和MySQL理论转换成新的东西之前,你至少应该以你所知道的方式测试它们。这意味着你似乎在试图形成一个查询,同时学习MySQLi。首先创建查询,使其工作。然后将其解构为MySQLi。