我使用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>";
}
}
}
谢谢!
答案 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} }字符。
因此,最好从用户输入中清除不安全的字符。
#
这意味着任何单引号或其他不安全字符都不会干扰您的查询执行。使用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"])
你很高兴。