【问题标题】:Ignore blank fields in form before writing to database using MySQLi在使用 MySQLi 写入数据库之前忽略表单中的空白字段
【发布时间】:2014-02-04 22:28:39
【问题描述】:

好的,所以问题是,当提交此表单并且有一些输入字段留空时,空白数据将写入数据库,并且因为我不希望每个字段的重复输入第二个填写除非他们将不同的字段留空,否则无法提交。

我不想这样做,所以人们必须填写所有字段,因为不是每个人都会拥有每个字段要求的用户名。

if(isset($_POST["signupbtn"])) {
    if ($log_username) {
        /// getting data from submitted form into local variables
        $x = preg_replace('#[^a-z 0-9]#i', '', $_POST['xbox']);
        $p  = preg_replace('#[^a-z 0-9]#i', '', $_POST['psn']);
        $s = preg_replace('#[^a-z 0-9]#i', '', $_POST['steam']);
        $ip = preg_replace('#[^0-9.]#', '', getenv('REMOTE_ADDR'));
        // DUPLICATE DATA CHECKS FOR GAMER PROFILES
        $sqli = "SELECT username FROM player WHERE xbox='$x' LIMIT 1";
        $query = mysqli_query($db_conx, $sqli); 
        $x_check = mysqli_num_rows($query);
        // -------------------------------------------
        if ($x_check > 0){ 
            echo "Xbox Gamer-Tag already linked to a user on this website";
            exit();
        } else if (is_numeric($x[0])) {
            echo 'Xbox Gamer-Tag cannot begin with a number';
            exit();
        }
        $sqli = "SELECT username FROM player WHERE psn='$p' LIMIT 1";
        $query = mysqli_query($db_conx, $sqli); 
        $p_check = mysqli_num_rows($query);
        // -------------------------------------------
         if ($p_check > 0){ 
            echo "PSN User already linked to a user on this website";
            exit();
        } else if (is_numeric($p[0])) {
            echo 'PSN User cannot begin with a number';
            exit();
        }
        $sqli = "SELECT username FROM player WHERE steam='$s' LIMIT 1";
        $query = mysqli_query($db_conx, $sqli); 
        $s_check = mysqli_num_rows($query);
        // FORM DATA ERROR HANDLING
         if ($s_check > 0){ 
            echo "Steam account already linked to a user on this website";
            exit();
        } else if (is_numeric($s[0])) {
            echo 'Steam account cannot begin with a number';
            exit();
        } else  { $sqli = "INSERT INTO player (id, username, xbox, psn, steam, ip, created, lastupdated, notecheck)        
                VALUES ('$id','$log_username','$x','$p','$s','$ip',NOW(),NOW(),NOW())"; 
                $query = mysqli_query($db_conx, $sqli);
                   echo "Gamer Profiles Updated";
                }   

        exit();

            if (!file_exists("p_player/$log_username")) {
                mkdir("p_player/$log_username", 0755);
            } 


     }


}

上面是 php,它工作正常,它将信息写入表没有问题,除了它还将空白数据写入数据库的事实。如果有人能指出我正确的方向,甚至解决我的问题,我将不胜感激。我已经查看了整个谷歌,但似乎找不到任何东西,因为我找到的所有答案都不完全是我的意思,而且由于我是 PHP 新手,因此任务似乎更难找到我正在寻找的正确答案.感谢您花时间阅读本文。

【问题讨论】:

  • 你是说你做了一个可以为空的、唯一的列吗?
  • 是的,在提交此表单时,空白字段会变成一个唯一字段,这样其他人就无法提交相同的空白字段,因为空白字段已被占用
  • 如果允许该字段为空,为什么该字段是唯一的,这没有意义?
  • 我知道是对的。我个人认为,如果一个字段留空,那么该行、列或任何内容都不会写入数据库,因为它是空白的,但据我发现并非如此,需要忽略空白字段,因此不会使用空白数据写入
  • 您要么需要在插入之前检查以确保该字段不为空,要么您需要允许该字段上的重复项。据我所知,您正在寻找某些应用程序的所有用户名。所以你我会允许重复,并对表进行查询以确保该列确实包含相同的用户名。

标签: php forms mysqli


【解决方案1】:

您仍然可以允许多个 NULL 值。将这些唯一列设置为具有默认值NULL,因此如果没有传递任何内容,它将存储NULL 而不是空值。

【讨论】:

  • 如果就这么简单,那就太棒了。多谢,伙计。我确实认为它纠正空地的方式有点奇怪。
  • 好的,所以我刚刚进入我的数据库并将它们全部更改为空。不提交表单,表单再次提交空值一个空数据的值。
  • 您需要为任何新的 INSERTS 建立一个默认值。这将要求您使用列编辑一些设置。见:How to set a default value for an existing column
  • 好的,谢谢您的回答,但老实说,我无法弄清楚他们在说什么。我已将我的数据库表设置为默认空值。
  • 我认为最适合您的方法是删除 UNIQUE 并使用输入验证来检查是否存在重复项。
【解决方案2】:

你差不多明白了,我会做以下

以蒸汽为例

if ($s != ''){
        $sqli = "SELECT username FROM player WHERE steam='$s' LIMIT 1";
        $query = mysqli_query($db_conx, $sqli); 
        $s_check = mysqli_num_rows($query);
        // FORM DATA ERROR HANDLING
         if ($s_check > 0){ 
            echo "Steam account already linked to a user on this website";
            exit();
        } else if (is_numeric($s[0])) {
            echo 'Steam account cannot begin with a number';
            exit();
        }
} else  { 
                $sqli = "INSERT INTO player (id, username, xbox, psn, steam, ip, created, lastupdated, notecheck)        
                VALUES ('$id','$log_username','$x','$p','$s','$ip',NOW(),NOW(),NOW())"; 
                $query = mysqli_query($db_conx, $sqli);
                   echo "Gamer Profiles Updated";
}   

然后在该字段中允许重复值。这将允许空白字段,但不允许包含数据的重复字段。

【讨论】:

  • 我相信您是在要求我将 ($s_check > 0) 与 ($s != '') 交换。一旦我这样做,我就会开始收到{错误
  • 给我一点时间,我会重新编码,确保我从来没有搞砸过
  • 好的,所以我又做了一次,一切都恢复正常了,但它仍然给我同样的问题
  • 对不起,卢克,我被跟踪了。将您的$s_check > 0 保留为将if 放在$sqli 之前并仅插入else (您几乎可以复制粘贴我放在那里的内容)。还要确保该列可以接受重复值(IE '')
  • 我已经通过拆分表格解决了这个问题。当涉及到更新字段时,这也将有所帮助,因为我在允许更新字段时遇到了问题。现在,当东西更新时,它只需要替换一个字段。谢谢老兄的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多