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

时间:2011-08-08 07:47:40

标签: php mysql sql

我是PHP的新手,我偶然发现了我不知道如何解决的问题。我99%是因为我对PHP的了解不多(自上周一以来我是PHP用户:))

就在前面,我将声明:

  • db conncetion正在运行
  • 表确实存在
  • 值正确保存到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");
    }
?>

表格应该做什么:

  • 如果选中该复选框 - 将“1”的值保存到“新闻”表中的“实时”字段中
  • 如果未选中该复选框 - 保存值'0'

如果选中该复选框,一切正常,但如果没有勾选复选框(应该回显$ live = 0),但是显示值= 1并注意到:Notice: Undefined index: live in C:\wamp\www\exe\news-exec.php on line 30

第30行:$live = clean($_POST['live']);

我99%肯定问题是那些声明:

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

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

我做错了什么?任何建议都非常感谢。

9 个答案:

答案 0 :(得分:3)

HTML:

<input type="hidden" name="live" class="textfield" id="live0" value="0" /> 
<input type="checkbox" name="live" class="textfield" id="live1" value="1" />

PHP:

$live = clean($_POST['live']);

这里发生的是,当未选中复选框时,隐藏字段的值将按原样提交。选中该复选框后,隐藏字段的POST值将被激活的复选框覆盖。

希望这有帮助。

答案 1 :(得分:2)

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

有很多方法可以解决这个问题。由于您没有分配value属性,我猜这个值是无关紧要的,所以你可以这样做:

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

答案 2 :(得分:2)

试试这个:

if (isset($_POST['live'])) $live=1; else $live=0;

第30行:$live = clean($_POST['live']); 导致isset($live)为真,无论是否设置了$_POST['live'],因此您必须直接检查$_POST['live']

答案 3 :(得分:2)

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

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

确实应该这样做。仅适用于三元运算符的一些实践。

答案 4 :(得分:1)

当您未选中此复选框时,未设置$ _POST [“live”],这就是您收到错误的原因。

你应该尝试类似的东西:

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

答案 5 :(得分:0)

要检查复选框是否已选中,请执行以下操作:

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

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

并检查查询

答案 6 :(得分:0)

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

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

$live = 1;
}else{
$live = 0;
}

答案 7 :(得分:0)

除了此处给出的示例之外,您可能还想检查在“实时”数据库列上设置的数据类型。您将其作为字符串传递,但如果您将其设置为INT,则不需要INSERT中值的引号

$qry = "INSERT INTO news(live, content) VALUES($live,'$content') ";

答案 8 :(得分:0)

与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;
?>