使用php更新到数据库

时间:2016-12-13 14:01:45

标签: php html database

我使用empty的唯一方法是使用它。但是,这不是我想要的。如果必须的话,我希望能留下一些空的东西。有谁知道我应该如何更改代码才能工作?

编辑页面:

<form name="homePage" action="update.php" method="POST">
<Strong>Change home title:</Strong>
<p>
    <input style="width: 300px;" type="text" name="homeTitleChange" value="<?php echo $homeTitle ?>">
    <input type="hidden" name="rowHomeID" value="<?php echo $getHomeID?>">
</p>

<Strong>Change home subtitle:</Strong>
<p>
    <input style="width: 600px;" type="text" name="homeSubtitleChange" value="<?php echo $homeSubtitle ?>">
    <input type="hidden" name="rowHomeID" value="<?php echo $getHomeID?>">
</p>
<input type="submit" class="btn btn-skin" name="homepage" value="save" />
</form>

查询页面: -

include("../conn.php");
include("../conn.php");
if(isset($_POST['homepage'])){
    if(
        !empty($_POST["homeTitleChange"])&& 
        !empty($_POST["homeSubtitleChange"]) &&  
        !empty($_POST["rowHomeID"])
    ){
        $homeTitleUpdate = $_POST["homeTitleChange"];
        $homeSubtitleUpdate = $_POST["homeSubtitleChange"]; 
        $homeEditRow = $_POST["rowHomeID"];
        $query = "UPDATE Home SET 
            title = '$homeTitleUpdate', 
            subtitle ='$homeSubtitleUpdate' 
            WHERE homeID = '$homeEditRow' ";
        $result = mysqli_query($conn, $query) or die(mysqli_error($conn));

        if ($result) {
            echo "<p> - Success!</p>";
        }else{
            echo "<p> - Something went wrong</p>";
        }
    }
}

谢谢!

4 个答案:

答案 0 :(得分:1)

前体:

  • 您已连接两次连接脚本。
  • 您将隐藏的表单字段<input type="hidden" name="rowHomeID" value="<?php echo $getHomeID?>">包括两次。这效率很低。
  • 您的表单应为enctype='multipart/form-data'Read Here

如果没有看到您的MySQL错误,我们无法完全诊断您的问题,相反,我会告诉您需要修复的部分:

默认情况下,PHP字符串类型将包含空字符串''而不是NULL值,因此我认为您的问题是空值未正确插入(至少不是如所描述的那样)在你的问题)。

$homeEditRow是唯一的必需值。因为UPDATE table SET column=value WHERE column=<empty>会导致错误(或至少没有更新)。

因此替换:

if(
    !empty($_POST["homeTitleChange"])&& 
    !empty($_POST["homeSubtitleChange"]) &&  
    !empty($_POST["rowHomeID"])
 )

使用:

if(!empty($_POST["rowHomeID"]){
     //run MySQL Update query.
}

此外,如果该值是一个整数,您可以简单地执行此操作:

$homeEditRow = (int)$_POST['rowHomeID']; //force to int.
if($homeEditRow > 0 ){
  //run MySQL Update query.
}

如果您愿意,您的其他两个值可以为空,那很好。

但是这些值不能包含的是MySQL中未转义的特殊字符,通常(但绝不是唯一的)`,'--,{{1} }字符。

因此,最好从用户输入中清除不安全的字符。

从不相信用户输入是&#34;安全&#34;

#

这意味着任何单引号或其他不安全字符都不会干扰您的查询执行。使用Prepared语句比这种方法更安全,并且推荐的方式做这些事情,你可以使用PDO or MySQLi,并且这些系统的Stack Overflow上有许多很好的例子。

如果达到这一点并且您仍然遇到问题,那么您需要阅读MySQL错误输出对您说的内容:

$homeTitleUpdate = mysqli_real_escape_string($conn,$_POST["homeTitleChange"]);
$homeSubtitleUpdate = mysqli_real_escape_string($conn,$_POST["homeSubtitleChange"]); 
//assuming to be integer required
$homeEditRow = (int)$_POST["rowHomeID"];

您可能遇到一些问题,例如您的主索引列包含两个非唯一值( etc等)。但是我们肯定不知道,直到你输出MySQL错误。

最后,要小心你的IF语句检查是否执行了更新查询,因为如果没有任何更改,则没有更新更新,MySQL将不会运行查询,因此当事实上一切正确运行时可能会返回false。

答案 1 :(得分:0)

如果没有指定您的错误,我们只能假设您的问题。只有您可以调试您的程序,因此为了将来通知,请在脚本顶部执行以下代码行并告诉我们您的错误。

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

继续,您的脚本包含一个条件,该条件检查$_POST中索引处的值是!empty()但不包围您的查询。这意味着,无论值是空还是设置,您的查询都将执行。

假设您只想在设置值时运行查询,可以使用if表达式对其进行换行:

 // an array of all the index's
$index = ['homeSubtitleChange', 'homeTitleChange', 'rowHomeID'];

 // loop through each index and check they're not empty
foreach($index as $_index)
{
    if( empty( $_POST[$_index] ) && !isset( $_POST['homepage'] ) )
    {
         // if empty - halt the program with an error
        die("Expected POST index: $_index or homepage.");
    }
}
unset($_index); //cleanup

 // if it got here - all index's have values
 // as Martin said in the comments, I assume you can wrap mysqli_real_escape_string()
 // and intval() ensuring the value is type (int) to protect
 // your database against SQL attacks
$subtitle = mysqli_real_escape_string($conn, $_POST[$index[0]]);
$title    = mysqli_real_escape_string($conn, $_POST[$index[1]]);
$row_id   = intval($_POST[$index[2]]);

 // consider upgrading to a PDO driver and using prepare() statements
 // this SQL statement is prone to SQL injections

$sql      = "UPDATE Home SET title = '$title', subtitle = '$subtitle' WHERE homeID = '$row_id'";

if( mysqli_query( $conn, $query ) )
{
    die("Success.");
}

die("Failed.");

答案 2 :(得分:0)

正如其他人所说,清理您的用户输入;把它直接放到数据库中是非常不安全的。

至于你的问题,根据我的理解你正在努力确保设置 的值,但你也希望能够传递 string!?

如果是这样,我认为你想要isset

//...
    if(
        isset($_POST["homeTitleChange"])&&
        isset($_POST["homeSubtitleChange"]) &&
        isset($_POST["rowHomeID"])
    ){
//...

这将确保您设置POST个值 ,如果他们提交了表单,则无论如何都应该这样设置;但是如果true = $_POST["rowHomeID"],它也会返回0,这可能不是你想要的,所以你可能想要回到使用!empty意味着它不能是空字符串或等于0

答案 3 :(得分:0)

如果我理解正确,您希望允许空字符串作为输入。 如果是这样,您想要的是isset()而不是!empty()

所以,这部分代码在你的代码中:

!empty($_POST["homeTitleChange"])&& 
!empty($_POST["homeSubtitleChange"]) &&  
!empty($_POST["rowHomeID"])

替换为:

isset($_POST["homeTitleChange"],$_POST["homeSubtitleChange"],$_POST["rowHomeID"])

你很高兴。