未定义的变量:stmt-in


Undefined variable: stmt in

我是php的新手。我在第($stmt->bindParam(":e1",$_POST['eidosmetaf1'])行找到了它。)error"未定义的变量:stmt-in"。这似乎是一个基本错误,但我搞不清楚。非常感谢您的帮助

<?php
require("config.inc.php");  
    $query = "UPDATE customer SET ";
if(isset($_POST['eidosmetaf1'])){ 
$stmt->bindParam(":e1", $_POST['eidosmetaf1']);
  $query .= "eidosmetaf1 = :e1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['weight1'])){  
$stmt->bindParam(":w1", $_POST['weight1']);
  $query .= "weight1 = :w1";
}
    $query = "UPDATE customer SET ";
if(isset($_POST['startNomos1'])){ 
$stmt->bindParam(":sn1", $_POST['startNomos1']);
  $query .= "startNomos1 = :sn1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['startPoli1'])){ 
$stmt->bindParam(":sc1", $_POST['startPoli1']);
  $query .= "startPoli1 = :sc1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['start_lat'])){ 
$stmt->bindParam(":slat1", $_POST['start_lat']);
  $query .= "start_lat = :slat1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['start_lng'])){ 
$stmt->bindParam(":slng1", $_POST['start_lng']);
  $query .= "start_lng = :slng1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['finalNomos1'])){ 
$stmt->bindParam(":fn1", $_POST['finalNomos1']);
  $query .= "finalNomos1 = :fn1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['finalPoli1'])){  
$stmt->bindParam(":fc1", $_POST['finalPoli1']);
  $query .= "finalPoli1 = :fc1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['final_lat'])){  
$stmt->bindParam(":flat1", $_POST['final_lat']);
  $query .= "final_lat = :flat1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['final_lng'])){  
$stmt->bindParam(":flng1", $_POST['final_lng']);
  $query .= "final_lng = :flng1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['depDate1'])){  
$stmt->bindParam(":dD1", $_POST['depDate1']);
  $query .= "depDate1 = :dD1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['depTime1'])){ 
$stmt->bindParam(":dT1", $_POST['depTime1']);
  $query .= "depTime1 = :dT1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['specialservices1'])){  
$stmt->bindParam(":ex1", $_POST['specialservices1']);
  $query .= "specialservices1 = :ex1";
}
$query = "UPDATE customer SET ";
if(isset($_POST['comments1'])){  
$stmt->bindParam(":c1", $_POST['comments1']);
  $query .= "comments1 = :c1";
}

    try {
        $stmt = $db->prepare($query);
       $stmt->execute();
    }
    catch (PDOException $ex) {
        $response["success"] = 0;
        $response["message"] = "Database Error2. Please Try Again!";
        die(json_encode($response));
    }    
    $response["success"] = 1;
    $response["message"] = "..............!";
    echo json_encode($response); 

?>

你在这里搞砸了一些事情!

您需要在绑定值之前准备好查询,否则php应该如何知道在当时不存在的查询中绑定值的位置和方式!此外,您还可以在每个if语句之前覆盖$query变量。

所以你的代码应该是这样的:

这里,我首先遍历数组$checkPostIndex,它将占位符作为索引,将POST变量索引作为值,在这里,我用array_filter()检查哪些$_POST变量被设置,哪些没有设置,这是我对isset()所做的,并将它们过滤掉。

在此之后,我循环遍历$checkedValues数组,该数组保存与$checkPostIndex完全相同的数据,但仅使用已设置的POST变量。这样,我就创建了查询,并创建了占位符数组,其中占位符作为索引,POST变量值作为值。

然后,我只需要用rtrim()从查询字符串中修剪最后一个逗号,就可以执行查询了。

<?php
    require_once "config.inc.php";  
    $query = "UPDATE customer SET ";
    $checkPostIndex = ["e1" => "eidosmetaf1", "w1" => "weight1", "sn1" => "startNomos1", "sc1" => "startPoli1", "slat1" => "start_lat", "slng1" => "start_lng", "fn1" => "finalNomos1",
    "fc1" => "finalPoli1", "flat1" => "final_lat", "flng1" => "final_lng", "dD1" => "depDate1", "dT1" => "depTime1", "ex1" => "specialservices1", "c1" => "comments1"];
    $bindValues = [];
    $checkedValues = array_filter($checkPostIndex, function($v){
        return isset($_POST[$v]);
    });
    foreach($checkedValues as $k => $v) {
        $query .= "$v = :$k,"; 
        $bindValues[$k] = $_POST[$v];
    }
    $query = rtrim($query, ",");
    try {           
        $stmt = $db->prepare($query);
        $stmt->execute($binValues);         
    } catch (PDOException $ex) {
        $response["success"] = 0;
        $response["message"] = "Database Error2. Please Try Again!";
        echo $ex->getMessage();
        die(json_encode($response));
    }    
    $response["success"] = 1;
    $response["message"] = "..............!";
    echo json_encode($response); 
?>

旁注:

我建议您在文件的顶部添加错误报告,这可以帮助您查找错误。仅在暂存时(不在生产中!):

<?php
    ini_set("display_errors", 1);
    error_reporting(E_ALL);
?>

在连接后立即为PDO连接启用错误模式:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
require("config.inc.php");
$query=array();
foreach(array('eidosmetaf1','...') as $k){
if(isset($_POST[$k])){ 
    $query[]= "$k = :$k";
}
}
$query = "UPDATE customer SET ".imolde(',',$query);
$query .= "";#where clause is missing
try {
    $stmt = $db->prepare($query);
    foreach(array('eidosmetaf1','...') as $k){
        if(isset($_POST[$k])){ 
            $stmt->bindParam(":$k", $_POST[$k]);
        }
    }
    $stmt->execute();
} catch (PDOException $ex) {
$response["success"] = 0;
$response["message"] = "Database Error2. Please Try Again!";
die(json_encode($response));
}    
$response["success"] = 1;
$response["message"] = "..............!";
echo json_encode($response); 

试着这样做:PREPARE语句字符串、CREATE PDO、PREPARE QUERY、BIND PARMS、EXECUTE