PHP-复选框值/db插入和if(isset())

PHP-复选框值/db插入和if(isset()),php,mysql,sql,Php,Mysql,Sql,我是PHP新手,我偶然发现了一个我不知道如何解决的问题。我99%是因为我对PHP的了解不够(从上周一开始我就是PHP用户:) 就在前面,我要声明: db连接正在工作 表确实存在 将值正确保存到数据库中 我有以下表格: <form id="loginForm" name="loginForm" method="post" action="../exe/news-exec.php"> <input name="live" type="checkbox" class=

我是PHP新手,我偶然发现了一个我不知道如何解决的问题。我99%是因为我对PHP的了解不够(从上周一开始我就是PHP用户:)

就在前面,我要声明:

  • db连接正在工作
  • 表确实存在
  • 将值正确保存到数据库中
我有以下表格:

<form id="loginForm" name="loginForm" method="post" action="../exe/news-exec.php">
      <input name="live" type="checkbox" class="textfield" id="live" />
      <input name="content" type="text" class="textfield" id="content" />
      <input type="submit" name="Submit" value="Register" />
</form>

以下文件正在执行此操作:

<?php
    //Start session
    session_start();

    //Include database connection details
    require_once('../inc/config.php');

    //Connect to mysql server
    $link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
    if(!$link) {
        die('Failed to connect to server: ' . mysql_error());
    }

    //Select database
    $db = mysql_select_db(DB_DATABASE);
    if(!$db) {
        die("Unable to select database");
    }

    //Function to sanitize values received from the form. Prevents SQL injection
    function clean($str) {
        $str = @trim($str);
        if(get_magic_quotes_gpc()) {
            $str = stripslashes($str);
        }
        return mysql_real_escape_string($str);
    }

    //Sanitize the POST values
    $live = clean($_POST['live']);
    $content = clean($_POST['content']);



    if(isset($live)) { $live = 1;}
    if(!isset($live)) { $live = 0;}



    //Create INSERT query
    $qry = "INSERT INTO news(live, content) VALUES('$live','$content') ";
    $result = @mysql_query($qry);

    //Check whether the query was successful or not
    if($result) {
        echo $live."<br /><br />";
        echo '<a href="../">Index File</a>';

        exit();
    }else {
        die("Query failed");
    }
?>

根据HTML规范,除非选中复选框,否则不会将其发送到服务器。您可以使用该函数查看$\u POST的确切内容

有很多方法可以解决这个问题。由于您没有指定
属性,因此我猜该值是不相关的,因此您可以这样做:

// $live is now a boolean
$live = isset($_POST['live']);
试试这个:

if (isset($_POST['live'])) $live=1; else $live=0;
第30行:
$live=clean($_POST['live'])

使
isset($live)
为真,无论是否设置了
$\u POST['live']
,因此您必须直接选中
$\u POST['live']

要选中复选框,请执行以下操作:

<input name="live" type="checkbox" class="textfield" id="live" value="Yes" />

if(isset($_POST['live']) && $_POST['live'] == 'Yes')
 {
      $live = 1;
 }
else
{
      $live = 0;
}  

如果(isset($\u POST['live'])&&$\u POST['live']=='Yes')
{
$live=1;
}
其他的
{
$live=0;
}  
并检查查询


<input name="live" type="checkbox" value="Yes" class="textfield" id="live" />

if(isset($live) && $live == 'Yes'){

$live = 1;
}else{
$live = 0;
}
如果(isset($live)&&$live==‘是’){ $live=1; }否则{ $live=0; }
如果不选中复选框,则未设置$\u POST[“live”],这就是为什么会出现错误

您应该尝试以下方法:

$live = isset($_POST["live"]) ? 1 : 0;

首先,您不需要清除一个变量,该变量的存在被用作标志。您会收到错误消息,因为在未选中复选框的情况下,$\u POST['live']甚至不存在

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

我们确实应该这样做。只是为了练习三元运算符。

以及这里给出的示例,您可能需要检查在DB列上设置的“live”数据类型。您将它作为字符串传递,但如果将其设置为INT,则不需要在INSERT中的值周围加引号

$qry = "INSERT INTO news(live, content) VALUES($live,'$content') ";
PDO也是如此

<?php
//Start session
session_start();

//Include database connection details
require_once('../inc/config.php');

/*** pdo connect ***/
$dbh = new PDO("mysql:host=$hostname;dbname=YOURDB", $username, $password);

/*** prepare the SQL statement ***/
$stmt = $dbh->prepare("INSERT INTO news(live, content) VALUES(:checkbox,:textbox)");

if(isset($_POST)){

    $live = $_POST['live'];
    $content = $_POST['content'];

    try {
        /*** bind the paramaters ***/
        $stmt->bindParam(':checkbox', $live, PDO::PARAM_INT);
        $stmt->bindParam(':textbox', $content);

        /*** execute the prepared statement ***/
        $stmt->execute();

        echo "Query successful ".$live."<br /><br />";
        echo '<a href="../">Index File</a>';

    }catch(PDOException $e){
        die("Query failed");
    }
}else{
    ?>
<form id="loginForm" name="loginForm" method="post" action="../exe/news-exec.php">
      <input name="live" type="checkbox" value="1" class="textfield" id="live" />
      <input name="content" type="text" value="" class="textfield" id="content" />
      <input type="submit" name="Submit" value="Register" />
</form>
<?php
}
/*db finnish*/
$dbh = null;
?>

HTML:

<input type="hidden" name="live" class="textfield" id="live0" value="0" /> 
<input type="checkbox" name="live" class="textfield" id="live1" value="1" />
这里发生的情况是,当复选框未选中时,隐藏字段的值将按原样提交。选中该复选框后,隐藏字段的POST值将被激活的复选框覆盖


希望这有帮助。

@Griwes-非常有帮助。谢谢。如果您使用:if(isset($live)){$live=1;}else{$live=0;}@AlphaMale-这与我的示例完全相同-不是吗?尝试自己调试它-使用此代码
echo”“;变量转储($变量);回声“
在代码中的不同位置打印变量值。您会很快找到答案。@Tomas Telensky-好的,它告诉我,当复选框未选中时-值为空,
如果(!isset($live)){$live=0;}
处理这个问题吗?我的建议是为所有输入元素设置值。我真的没有确凿的证据来证明我的观点,但它在JS和服务器端都很有帮助。@阿尔瓦罗·G·维卡里奥——这应该放在我的代码中的什么位置来影响我的if语句?就在它之前?@NewUser,这应该替换触发通知的代码行。工作正常-您能解释一下这个语句的确切含义吗?clean()函数返回一个空字符串,它与NULL值不同。因此,在配置之前,您需要设置()美元的POST值。如果要检查该值是否为空,请使用empty()。如果为NULL、空字符串和0,则返回TRUE。在本例中,您将编写if(!empty($live)){$live=1;}。三元运算符的工作方式类似于if/else语句$var=?价值1:价值2。如果条件为真,$var变为value1或value2,则对其进行评估。
$live = clean($_POST['live']);