使用php在mysql中插入复选框数据

zkure5ic  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(426)

我正在创建一个表单,其中用户勾选复选框,然后1将存储在mysql表的该列中。如果用户没有勾选,则0将存储在数据库的该字段中。一列一个复选框。我的html代码是:

Type ;<label class="checkbox-inline"><input type="checkbox" name="mentor" value="1" >Mentor</label>

  <label class="checkbox-inline"><input type="checkbox" name="core" value="1" >Core</label>

我的php代码是

$name = mysqli_real_escape_string($DBcon, $_POST['name']);
    $mentor;
    if (isset ($_POST['mentor']) == "1")
    {   
        $mentor = 1;

    } 
    else 
    {  
         $mentor = 0;
    }
    $core;
    if (isset ($_POST['core']) == "1")
    {   
        $core =1;

    } 
    else 
    {  
         $core =0;
    }
    $insert = $DBcon->query("INSERT into contributor(name,mentor,core) VALUES('$name','$mentor','$core')");

但是我得到“你的sql语法有错误;检查与您的mysql服务器版本相对应的手册,以了解在“????\”exif\0\0mm\0*\0\0\0\0\0\0\0\0\0?\0\0\0\0?\0\0\0\0\0\0\”附近使用的正确语法。当我按submit按钮时,出现此错误

mlnl4t2r

mlnl4t2r1#


# as @War10ck mentioned, you're mixing Procedural-style with object oriented

$name = $DBCon->real_escape_string($_POST['name']);

# You were comparing a boolean (isset) with "1". Since it's a checkbox, you an do this (or $_POST['mentor'] == "1" since that's your value on the form..)

$mentor = isset($_POST['mentor']) ? 1 : 0;
$core = isset($_POST['core']) ? 1 : 0;

# remove single quotes from your $paramaters

$insert = $DBcon->query("INSERT into contributor(name,mentor,core) VALUES($name, $mentor, $core)");

注意,您应该像其他人提到的那样使用pdo准备的语句

$stmt = $DBcon->prepare("INSERT INTO contributor(name, mentor, core) VALUES(?,?,?)");
$stmt->bind_param('sssd', $name, $mentor, $core);

$insert = $stmt->execute();
yqlxgs2m

yqlxgs2m2#

你似乎混合了过程和面向对象 mysqli_* 代码中的语句。你应该选一个。在这里换行:

mysqli_real_escape_string($DBcon, $_POST['name']);

改为:

$DBCon->real_escape_string($_POST['name']);

此外,您还需要删除查询语句中的嵌套单引号:

$insert = $DBcon->query("INSERT into contributor(name,mentor,core) VALUES($name,$mentor,$core)");

安全影响:
我不能不说(也不能不附和上面的评论),你将自己置身于使用这种方法的sql注入攻击中。为了确保您受到保护,您应该考虑使用 mysqli_* 以及 PDO_* 扩展。
请考虑使用以下更安全的替代方案,而不是上面使用的代码:

$DBCon = new \PDO('{dsn}', '{user}', '{pass}', [
    \PDO::ATTR_ERRMODE          => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => FALSE
]);

$mentor = (isset($_POST['mentor']) AND intval($_POST['mentor']) === 1) ? 1 : 0;
$core = (isset($_POST['core']) AND intval($_POST['core']) === 1) ? 1 : 0;

try {
    $stmt = $DBCon->prepare("INSERT INTO contributor(name,mentor,core) VALUES (:name,:mentor,:core)");

    $stmt->bindParam(':name', $name, PDO::PARAM_STR);
    $stmt->bindParam(':mentor', $mentor, PDO::PARAM_INT);
    $stmt->bindParam(':core', $core, PDO::PARAM_INT);

    $stmt->execute();

    /* Cleanup (if you are finished interacting with the database) */
    $stmt = NULL;
    $DBCon = NULL;

} catch (\PDOException $e) {
    /* Handle Error Here */
}
8xiog9wr

8xiog9wr3#

php使用单引号表示文本。也就是说,$varname不会被解释为表示0,而是表示$varname。删除单引号,它应该工作。 "INSERT into contributor(name,mentor,core) VALUES($name,$mentor,$core)"'INSERT into contributor(name,mentor,core) VALUES('.$name.','.$mentor.','.$core.')' 如果这是为了工作,请阅读了php pdo和它增加的安全性。

相关问题