Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 重置变量';来自foreach循环内部的s值_Php_Variables_Foreach - Fatal编程技术网

Php 重置变量';来自foreach循环内部的s值

Php 重置变量';来自foreach循环内部的s值,php,variables,foreach,Php,Variables,Foreach,我正在处理其他人的代码,看起来MySQL Insert语句有一些问题 第1行“floorSize”列的数据被截断 对于相当多的字段,它似乎是这样做的,但理想情况下,我希望允许它们为空 因此,我将遍历发布的数据并查找空字符串,如果它是空字符串,我希望将该变量重置为NULL。这样DB就可以接受空值而不是'字符串 目前,我正在使用foreach循环查看该值是否为空,然后尝试将该值设置为NULL。但没什么好看的 当前代码段为: function add_user($first_name, $last_n

我正在处理其他人的代码,看起来MySQL Insert语句有一些问题

第1行“floorSize”列的数据被截断

对于相当多的字段,它似乎是这样做的,但理想情况下,我希望允许它们为空

因此,我将遍历发布的数据并查找空字符串,如果它是空字符串,我希望将该变量重置为NULL。这样DB就可以接受空值而不是'字符串

目前,我正在使用foreach循环查看该值是否为空,然后尝试将该值设置为NULL。但没什么好看的

当前代码段为:

function add_user($first_name, $last_name, $gender, $date_of_birth, $address1, $address2, $city, $state, $country, $zip_code, $mobile, $phone, $username, $email, $password, $profile_image, $description, $status, $user_type, $property, $VAN, $agent, $propertyType, $buyerType, $houseName, $street, $postcode, $parish, $zoning, $lat, $lng, $price, $ARV, $tax, $fees, $availableDate, $term, $type, $bedrooms, $bathrooms, $powderrooms, $guestAccom, $furnished, $shortDescription, $floorSize, $plotSize, $pool, $waterfront, $dock, $tennis, $view, $garden, $pets, $fireplace, $laundry, $ac, $patio, $deck, $verandah, $beach, $propertySkipper, $mooring, $gym, $showMap, $display, $videoURL, $garage, $tankSize, $water, $well, $tank, $holiday) {

    global $db;

    $vars = $_POST;

    $count = 0;
    foreach($vars as $k => $v)
    {
        if($v == '')
        {
            $k = NULL;
        }
    }

    //Running Query to add user.
        $query = "INSERT into users VALUES(NULL, '".$first_name."', '".$last_name."', '".$gender."', '".$date_of_birth."', '".$address1."', '".$address2."', '".$city."', '".$state."', '".$country."', '".$zip_code."', '".$mobile."', '".$phone."', '".$username."', '".$email."', '".$password_con."', '".$profile_image."', '".$description."', '".$status."', '', '".date('Y-m-d')."', '".$user_type."', '".$property."', '".$VAN."', '".$agent."', '".$propertyType."', '".$buyerType."', '".$houseName."', '".$street."', '".$postcode."', '".$parish."', '".$zoning."', '".$lat."', '".$lng."', '".$price."', '".$ARV."', '".$tax."', '".$fees."', '".$availableDate."', '".$term."', '".$type."', '".$bedrooms."', '".$bathrooms."', '".$powderrooms."', '".$guestAccom."', '".$furnished."', '".$shortDescription."', '".$floorSize."', '".$plotSize."', '".$pool."', '".$waterfront."', '".$dock."', '".$tennis."', '".$view."', '".$garden."', '".$pets."', '".$fireplace."', '".$laundry."', '".$ac."', '".$patio."', '".$deck."', '".$verandah."', '".$beach."', '".$propertySkipper."', '".$mooring."', '".$gym."', '".$location_id."', '".$showMap."', '".$display."', '".$videoURL."', '".$garage."', '".$tankSize."', '".$water."', '".$well."', '".$tank."', '".$holiday."')";
}
例如,$floorSize设置为“”,但理想情况下,我希望覆盖它以将其设置为NULL

我的问题是:

INSERT into users VALUES(NULL, '', '', '', '2000-01-01', '', '', '', '', 'Bermuda', '', '', '', '', 'amy.peniston@gmail.com', '0cc0d896622bca5f24125fd5e5f2fabb', '', '', 'activate', '', '2019-09-13', 'subscriber', 'PW Property', '', 'sue', '1', '0', '', '', '', 'devonshire', '', '32.309851', '-64.781894', '125000', '100', '1', '2', '', '', 'sale', '3', '3', '1', '0', '0', '', '', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '472', '0', '0', '', '0', '', '0', '0', '0', '0')

感谢您在insert查询中使用函数参数。因此,您不应该检查$\u POST中的值

// we can use this function inside of your function to get all paramenters
$params = get_defined_vars();

global $db;

foreach($params as $key => $param){
    if(empty($param)){
        ${$key} = NULL;
    }
    // we need to remove special characters to prevent sql injection
    ${$key} = mysqli_real_escape_string($db, $param);
}

// your query here
无论如何,这不是一个理想的解决方案,因为它可能会遇到很多问题,因此我建议您删除所有函数参数,因为有很多函数参数直接来自
$\u POST

function add_user() {
    global $db;

    $values = $_POST;

    foreach ($values as $key => $value) {
        $values[$key] = mysqli_real_escape_string($db, $value);

        if(empty($value)){
            $values[$key] = 'NULL';
        }
    }


    $first_name = $values['first_name'];
    $last_name = $values['last_name'];
    // .... and all your variables

    // be careful to get the right key from $POST variable when setting these variables

}

您正在插入查询中使用函数参数。因此,您不应该检查$\u POST中的值

// we can use this function inside of your function to get all paramenters
$params = get_defined_vars();

global $db;

foreach($params as $key => $param){
    if(empty($param)){
        ${$key} = NULL;
    }
    // we need to remove special characters to prevent sql injection
    ${$key} = mysqli_real_escape_string($db, $param);
}

// your query here
无论如何,这不是一个理想的解决方案,因为它可能会遇到很多问题,因此我建议您删除所有函数参数,因为有很多函数参数直接来自
$\u POST

function add_user() {
    global $db;

    $values = $_POST;

    foreach ($values as $key => $value) {
        $values[$key] = mysqli_real_escape_string($db, $value);

        if(empty($value)){
            $values[$key] = 'NULL';
        }
    }


    $first_name = $values['first_name'];
    $last_name = $values['last_name'];
    // .... and all your variables

    // be careful to get the right key from $POST variable when setting these variables

}

$k
是键,您需要分配值。您可以通过将
$v
作为参考变量来实现这一点

    foreach($vars as $k => &$v)
    {
        if($v == '')
        {
            $v = null;
        }
    }
如果您这样调用函数:

add_user($_POST['first_name'], $_POST['last_name'], ...);
然后你需要在调用函数之前放置这个循环,而不是在函数内部。您需要循环使用
$\u POST
,而不是将其复制到另一个变量(除非在调用时在参数列表中使用该变量)

然后你需要使用一个准备好的陈述。如果只是将变量连接到SQL字符串,
null
将返回空字符串,它不会成为数据库中的
null
值。准备好的语句还可以防止SQL注入

$query = "INSERT into users VALUES(NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$stmt = $db->prepare($query);
$date = date('Y-m-d');
$stmt->bind_param("sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss", $first_name,$last_name,$gender,$date_of_birth,$address1,$address2,$city,$state,$country,$zip_code,$mobile,$phone,$username,$email,$password_con,$profile_image,$description,$status,$date,$user_type,$property,$VAN,$agent,$propertyType,$buyerType,$houseName,$street,$postcode,$parish,$zoning,$lat,$lng,$price,$ARV,$tax,$fees,$availableDate,$term,$type,$bedrooms,$bathrooms,$powderrooms,$guestAccom,$furnished,$shortDescription,$floorSize,$plotSize,$pool,$waterfront,$dock,$tennis,$view,$garden,$pets,$fireplace,$laundry,$ac,$patio,$deck,$verandah,$beach,$propertySkipper,$mooring,$gym,$location_id,$showMap,$display,$videoURL,$garage,$tankSize,$water,$well,$tank,$holiday);
$stmt->execute();

$k
是键,您需要分配值。您可以通过将
$v
作为参考变量来实现这一点

    foreach($vars as $k => &$v)
    {
        if($v == '')
        {
            $v = null;
        }
    }
如果您这样调用函数:

add_user($_POST['first_name'], $_POST['last_name'], ...);
然后你需要在调用函数之前放置这个循环,而不是在函数内部。您需要循环使用
$\u POST
,而不是将其复制到另一个变量(除非在调用时在参数列表中使用该变量)

然后你需要使用一个准备好的陈述。如果只是将变量连接到SQL字符串,
null
将返回空字符串,它不会成为数据库中的
null
值。准备好的语句还可以防止SQL注入

$query = "INSERT into users VALUES(NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$stmt = $db->prepare($query);
$date = date('Y-m-d');
$stmt->bind_param("sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss", $first_name,$last_name,$gender,$date_of_birth,$address1,$address2,$city,$state,$country,$zip_code,$mobile,$phone,$username,$email,$password_con,$profile_image,$description,$status,$date,$user_type,$property,$VAN,$agent,$propertyType,$buyerType,$houseName,$street,$postcode,$parish,$zoning,$lat,$lng,$price,$ARV,$tax,$fees,$availableDate,$term,$type,$bedrooms,$bathrooms,$powderrooms,$guestAccom,$furnished,$shortDescription,$floorSize,$plotSize,$pool,$waterfront,$dock,$tennis,$view,$garden,$pets,$fireplace,$laundry,$ac,$patio,$deck,$verandah,$beach,$propertySkipper,$mooring,$gym,$location_id,$showMap,$display,$videoURL,$garage,$tankSize,$water,$well,$tank,$holiday);
$stmt->execute();


他只想在值为空字符串时执行此操作。是的,我向他演示了如何执行此操作。因此,他只需要在$k变量中添加单引号,在那里他有自己的条件。难道他不应该使用一个准备好的语句来阻止SQL注入吗?为什么要设置
$k
?这和他在代码中犯的错误是一样的。您应该设置
$vars[$k]
。第一个问题是它位于foreach循环中,默认情况下,该循环将
$k
$v
复制原始值。更改这些不会更改原始数据。第二个问题,当键值是要插入的值时,为什么要将键值设置为null?他只想在值为空字符串时执行此操作。是的,我向他演示了如何执行此操作。因此,他只需要在$k变量中添加单引号,在那里他有自己的条件。难道他不应该使用一个准备好的语句来阻止SQL注入吗?为什么要设置
$k
?这和他在代码中犯的错误是一样的。您应该设置
$vars[$k]
。第一个问题是它位于foreach循环中,默认情况下,该循环将
$k
$v
复制原始值。更改这些不会更改原始数据。第二个问题,当它是要插入的值时,为什么要将键设置为null?如果从
$\u POST
获取数据,那么所有函数参数都是什么?我们可以查看您的查询吗?当然,将立即添加插入查询请尝试插入与this@EdisonBiba显示所有代码并更新问题如果您从
$\u POST
获取数据,那么所有函数参数是什么?我们可以查看您的查询吗?当然,将立即添加插入查询请尝试插入与this@EdisonBiba显示的所有代码和更新的问题这将修复
$vars
值,但似乎OP甚至没有在查询中使用它们(在他们添加到问题的代码中)。在他显示查询之前,我写了我的答案。我假设他将在查询中使用
$vars
。这将修复
$vars
值,但OP似乎甚至没有在查询中使用它们(在他们添加到问题的代码中)。在他显示查询之前,我写下了我的答案。我假设他将在查询中使用
$vars