【问题标题】:How to not update database if $_POST value is empty?如果 $_POST 值为空,如何不更新数据库?
【发布时间】:2016-12-30 20:56:00
【问题描述】:

我的网站形式存在问题。表单值等于它们对应的$_POST 值,这些值是用于更新数据库的参数。

我不想更新空的表单值。但是,我不希望任何输入区域都是强制性的。

这意味着我可以只更新特定内容,而无需在我不想更新的输入区域中键入值。但是,我对此有疑问。正在上传空表单值,因此数据库中的值正在更改为空白值。我已经在 SO 和互联网上寻找教程,唯一的(功能性)教程是将输入框变成强制性的。这不是我想要的工作方式,所以它不适合。

我认为最好的方法是,但我不确定,当提交按钮设置为空或空值时,通过 javaScript 将输入区域的“名称”属性更改为空白。我不知道该怎么做,也不知道这是否可能,或者最好的方法。

这是我目前关于此事的代码:

(首先,javascript的形式)

<script>
function validade(){
    var formId = document.getElementById("configForm");
    var allInputs =  formId.getElementsByTagName("input");
    var input, i;

    for (i=0; input = allInputs[i]; i++){
        if (input.value == null || input.value == "") {
            input.name = "";
        }
    }
}

<form method="post" action="" id="configForm">
<label for="home">Home:</label>
<br>
<input type="text"  id="home" name="home">
<br>
<label for="apendix">Apêndice:</label>
<br>
<input type="text" name="apendix">
<br>
<label for="about">Sobre:</label>
<br>
<input type="text" name="sobre">
<br>
<label for="contato">Contato:</label>
<br>
<input type="text" name="contato">
<br><br>
<input type="submit" value="Carregar" name="submit">
</form>

<?php require_once('editaForma.php'); ?> 

(其次是数据库查询和$_POST值:)

<?php //credentials
if (isset($_POST["submit"])){
    $server = 'hypotetical';
    $user = 'hypotetical';
    $pw = 'hypotetical';
    $BD = 'hypotetical';

    //estabelece a conexão
    $conn = mysqli_connect($server, $user, $pw, $BD);
    if (!$conn) {
        die ('<span style="color: #FF0000;">"connection failed: "</span>' .  mysqli_connect_error());
    }

    $home = $_POST["home"];
    $apendix = $_POST["apendix"];
    $sobre = $_POST["sobre"];
    $contato = $_POST ["contato"];

    $query = "UPDATE form SET 
    home= '$home',
    apendix= '$apendix',
    sobre= '$sobre',
    contato= '$contato'
    WHERE id='1'";



    //$query = "INSERT INTO form (home, apendix, sobre, contato) VALUES ('$home', '$apendix', '$sobre', '$contato')";

    if (mysqli_query($conn, $query)){
        echo "Alterações feitas com sucesso";
    } else {
        echo "ERRO!" . $query . "<br>" . mysqli_error($conn);
    }

    mysqli_close($conn); 
}
?>

是的,我知道数据库容易发生 SQL 注入。我正在尝试首先启动并运行所有内容,一旦所有这些都设置好,我会在网站上线之前查看安全问题。

我已经遇到这个问题一个多星期了,无法解决。

提前感谢您的时间和关注。

编辑

我希望我可以选择两个答案来解决问题。他们两个都让我解决了问题,每个人都帮助我看到了代码中的漏洞。由于我不能同时选择两者,所以我选择了帮助我解决最后一个问题的那个。非常感谢大家!

【问题讨论】:

  • 你的标题中已经有了答案:if:php.net/manual/en/control-structures.if.php 既然你已经在脚本的其他地方使用了它,那么阻碍你使用它来制作query() 调用条件?
  • 停止为“试图让它发挥作用”找借口,开始使用准备好的语句。他们解决的问题多于他们创造的问题,如果您以有纪律的方式使用它们,您将永远不会逃避需要数小时才能追踪的问题。在这种情况下,它实际上是多两行代码,如果这段代码无意中投入生产,它可以挽救一个伤害世界,当你不注意时,代码往往会这样做。
  • 对不起,如果这听起来很愚蠢。我正在以一种混乱的方式学习代码。那么,将付出更多的努力,并学习准备好的陈述。谢谢。
  • 作为替代选项,只需使用数据库中的当前值预先填写表单。

标签: javascript php database forms


【解决方案1】:

通过跳过空值动态构建查询

$p = &$_POST; //make $p refer to $_POST

$query = "UPDATE from SET ";

if($p['home'])    $query .= " home = '$p[home]' ,";
if($p['apendix']) $query .= " apendix = '$p[apendix]' ,";
if($p['sobre'])   $query .= " sobre = '$p[sobre]' ,";
if($p['contato']) $query .= " concato = '$p[contato]' ,";

$query = trim($query, ','); //remove any trailing comma 
$query = "WHERE id = 1";

然后您可以执行查询。哦,别忘了检查至少有 1 个变量可用。如果都是空的,不要执行。

是的,您的代码非常容易受到攻击。

【讨论】:

  • 谢谢。这做到了。问题是,我不明白为什么 $p['home'] 不更新空白值,而 $home 会。你愿意解释一下吗?
  • 让我看看我是否做对了,trim() 函数会删除空白空间,因此,如果 $p[home] 为空,则不会被计算。对吗?
  • @PauloSoares 上面代码中的修剪只是删除了尾随的逗号,正如评论所暗示的那样。没有空间修剪交换正在进行。如果 $p['home'] 是一个空字符串,它的计算结果为 false 并且查询的那部分被省略。
【解决方案2】:

抛开明显的安全漏洞,我通常会建立一个字符串,如下所示:

$home = $_POST["home"];
$apendix = $_POST["apendix"];
$sobre = $_POST["sobre"];
$contato = $_POST ["contato"];

$query = "UPDATE form SET ";
if(!empty($home)) {
    $query .= "home= '$home',";
}
if(!empty($apendix)) {
    $query .= "apendix= '$apendix',";
}
if(!empty($sobre)) {
    $query .= "sobre= '$sobre',";
}
if(!empty($contato)) {
    $query .= "contato= '$contato',";
}

// strip off any extra commas on the end
$query = rtrim($query, ',');

$query .= "WHERE id='1'";

在末尾使用逗号构建查询还允许您在以后需要时轻松添加更多选项。

【讨论】:

【解决方案3】:

我做到了,使用 NULLIF 以一种简单的方式

set potato = NULLIF(potato,'')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2017-11-27
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多