我的代码假设将一年如1999
保存到mysql数据库,但它不会。它将检查用户是否只输入了数字并且至少有4个数字,或者是否没有正确输入但是它不会保存正确的年份?我该如何解决这个问题。
这是PHP代码。
if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
} else if($_POST['year'] && strlen($_POST['year']) < 4) {
echo '<p class="error">year is not correct!</p>';
} else if($_POST['year'] == NULL) {
// do something
}
以下是代码的用途。
if (mysqli_num_rows($dbc) == 0) {
$mysqli = mysqli_connect("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year)
VALUES ('$user_id', '$year')");
}
if ($dbc == TRUE) {
$dbc = mysqli_query($mysqli,"UPDATE users
SET year = '$year'
WHERE user_id = '$user_id'");
echo '<p class="changes-saved">Your changes have been saved!</p>';
}
if (!$dbc) {
print mysqli_error($mysqli);
return;
}
以下是代码。
if (isset($_POST['submit'])) {
if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
} else if($_POST['year'] && strlen($_POST['year']) < 4) {
echo '<p class="error">year is not correct!</p>';
} else if($_POST['year'] == NULL) {
if (mysqli_num_rows($dbc) == 0) {
$mysqli = mysqli_connect("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year)
VALUES ('$user_id', '$year')");
}
if ($dbc == TRUE) {
$dbc = mysqli_query($mysqli,"UPDATE users
SET year = '$year'
WHERE user_id = '$user_id'");
echo '<p class="changes-saved">Your changes have been saved!</p>';
}
if (!$dbc) {
print mysqli_error($mysqli);
return;
}
}
}
问题必须放在这一行上。
if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
答案 0 :(得分:1)
首先,检查$_POST['year']
中发送的内容是否在您的逻辑陈述之上的某个位置error_log($_POST['year']);
或echo $_POST['year'];
。
其次,你实际上没有在该代码中写入任何查询,只是一个$year
变量,我猜你正在尝试消毒。
第三,看起来你的if / else
语句链中存在逻辑错误。
试试这个。
if (isset($_POST['submit']))
{
if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
} else if($_POST['year'] && strlen($_POST['year']) < 4) {
echo '<p class="error">year is not correct!</p>';
} else if($_POST['year'] == NULL) {
} else {
if (mysqli_num_rows($dbc) == 0) {
$mysqli = mysqli_connect("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year)
VALUES ('$user_id', '$year')");
}
if ($dbc == TRUE) {
$dbc = mysqli_query($mysqli,"UPDATE users
SET year = '$year'
WHERE user_id = '$user_id'");
echo '<p class="changes-saved">Your changes have been saved!</p>';
}
if (!$dbc) {
print mysqli_error($mysqli);
return;
}
}
}
答案 1 :(得分:1)
如果$ _POST [“year”] == NULL,则只运行查询。你确定那是你想要做的吗?
可能会将第一个块更改为:
if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
} else if($_POST['year'] && strlen($_POST['year']) < 4) {
echo '<p class="error">year is not correct!</p>';
}
if (isset($year)) {
答案 2 :(得分:0)
您似乎从表单元素中将$ year的转义字符串值传入$ year,但您似乎没有对它执行任何操作(至少这是您展示的所有内容)?
将数据放入数据库的代码在哪里?
类似的东西:
$ mysqli-&gt;查询(“插入表格 (ColumnName)值('$ year')“;
更新您的代码示例后编辑:
如果您的年份为空,则仅在DB中运行代码。改变你的代码,如David / Josh所示。 : - )
答案 3 :(得分:0)
我认为大卫是对的。尝试将您在上面提供的整个代码更改为:
if (isset($_POST['submit']))
{
if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
} else if($_POST['year'] && strlen($_POST['year']) < 4) {
echo '<p class="error">year is not correct!</p>';
} else {
// echo 'Year is blank' or whatever you like here
}
// if $_POST['year'] was entered correctly, $year will now
// have an assigned value and the mysql query will exit
if (isset($year)) {
if (mysqli_num_rows($dbc) == 0) {
$mysqli = mysqli_connect("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"INSERT INTO users (user_id, year)
VALUES ('$user_id', '$year')");
// uncomment below to see the query
// echo "INSERT INTO users (user_id, year) VALUES ('$user_id', '$year')";
}
// I'd suggest changing this if ($dbc) { to:
else {
$dbc = mysqli_query($mysqli,"UPDATE users
SET year = '$year'
WHERE user_id = '$user_id'");
// uncomment below to see the query
// echo "UPDATE users SET year = '$year' WHERE user_id = '$user_id'";
echo '<p class="changes-saved">Your changes have been saved!</p>';
}
if (!$dbc) {
print mysqli_error($mysqli);
return;
}
}
}
}
另外,考虑到你的两个原始查询都是单独的if块而不是if-else语句,不管怎么说,这两个查询都没有被执行。上面的代码将其更改为if-else语句,因此至少会执行一个查询。我相信这是原始代码的意图,无论如何。
如果仍然不起作用,请取消注释这些行以回显查询并查看实际发送到数据库的内容。
答案 4 :(得分:0)
您确实在努力清理数据:
if(isset($_POST['year']) && intval($_POST['year']) && strlen($_POST['year']) == 4) {
精细。很高兴看到该值是否实际存在于提交的数据中,以及字段中是否存在某种数值,但是...
$year = mysqli_real_escape_string($mysqli, $purifier->purify(htmlentities(strip_tags($_POST['year']))));
如果所有这一切的效果都是为了确保那里没有非数字,那么为什么不简单地执行以下操作:
$year = null;
if (isset($_POST['year'])) {
$year = preg_replace('/\D/', '', $_POST['year']) // replace anything non-numeric with nothing
if ($year < 1000) {
$year = null;
)
}
这消除了任何尝试的html或sql或javascript注入,确保你有纯数字数据,并且还确保你至少有一个4位数的年份,以及y10k,y100k等。 ..合规。
经过一年的消毒后,您可以将其粘贴到数据库中,如下所示:
if (!isnull($year)) {
$sql = <<<EOF
INSERT INTO users (user_id, year)
VALUES ($user_id, $year)
ON DUPLICATE KEY UPDATE
year=VALUES(year);
EOF;
$stmt = mysqli_query($sql) or die("Query error: " . mysqli_error()):
}