php mysql准备语句绑定param错误

时间:2017-08-02 08:46:33

标签: php mysql prepared-statement

我一直坚持这个错误。感谢任何帮助:

此函数是使用ajax的较长代码的一部分。 Ajax没有问题进入函数,检索后期数据。代码返回带有$ message的结果,它返回到ajax,数据被检索为response.message

错误发生在它遇到bind_param的那一刻。

尝试将bind_param中的代码注释掉,ajax返回测试消息就好了。

当未注释的bind_param时,即使在bind_param失败时发送消息'fail',否则发送消息'pass'。没有任何东西进入$ message。

为什么会发生这种情况的任何想法?

代码:

function edit_Loc_Name($connection){//67
    $new_loc_name = mysqli_real_escape_string($connection, $_POST['location_editloc_name']);
    $projid = mysqli_real_escape_string($connection, $_POST['projid']);
    $loc_id = mysqli_real_escape_string($connection, $_POST['edit_loc_id']);
    $checklocname = checkLocationLoc($projid,$new_loc_name,$connection);
    if ($checklocname === "Duplicate location."){
        $message = "Duplicate location.";
    }else if($checklocname === "Location okay"){
        $stmt = $connection->prepare("UPDATE projectlocation SET locname = ? WHERE id = ?");
        if($stmt === false){
            $message = "Ajax err:67 1";$stmt->close();
        }else{
            $stmt->bind_param('si',$new_loc_name,$loc_id);
            $rc = $stmt->execute();
            if($rc === false){
                $message = "Ajax err:67 3";$stmt->close();
            }else{
                $message = "Location updated.";$stmt->close();
            }
        }
    }else{
        $message = "Ajax err:67 5";
    }
    $connection->close();
    return $message;
}

2 个答案:

答案 0 :(得分:2)

您正在将数据传递给real_escape_string(如上所述,如果稍后再绑定则不需要)。

此函数返回一个字符串,因此$ loc_id现在是一个字符串。

但是在绑定中:

$stmt->bind_param('si',$new_loc_name,$loc_id);

您将数据声明为si(字符串,整数)而不是ss。

尝试解决此问题。

更新

举个例子,我在我的localhost中运行了这个脚本,它运行正常:

    $connection=mysqli_connect("localhost", "root", "", "my-db");

function edit_Loc_Name($connection){
$loc_id = 1;
$checklocname = "Location okay";    

if ($checklocname === "Duplicate location."){
    $message = "Duplicate location.";
}else if($checklocname === "Location okay"){
    $stmt=$connection->prepare("select * from my-table where id=?");
    if($stmt === false){
        $message = "Ajax err:67 1";//$stmt->close();
    }else{
        $stmt->bind_param('i',$loc_id);
        $rc = $stmt->execute();
        if($rc === false){
            $message = "Ajax err:67 3";//$stmt->close();
        }else{
            $message = "Location updated.";//$stmt->close();
        }
    }
}else{
    $message = "Ajax err:67 5";
}
$connection->close();
return $message;
}
echo edit_Loc_Name($connection)

答案 1 :(得分:0)

在多个函数调用期间,$ connection已关闭。

checkLocationLoc($ projid,$ new_loc_name,$ connection)关闭了$ connection。

因此所有与$ connection相关的方法都没有响应。

一旦$ connection-> close();被删除,一切运作良好。

对不起麻烦的家伙们。这对我来说是一个艰苦的教训。