我正在尝试更新审阅表中的两列risk2和comment2。
该表包含
public class ValidateModelStateAttribute : System.Web.Http.Filters.ActionFilterAttribute
// there are two ActionFilterAttribute, one for MVC and another one for REST
{
/// <summary>
/// Called before the action method is invoked
/// </summary>
/// <param name="context"></param>
public override void OnActionExecuting(HttpActionContext context)
{
var parameters = context.ActionDescriptor.GetParameters();
foreach (var p in parameters)
{
if (context.ActionArguments.ContainsKey(p.ParameterName))
Validate(p, context.ActionArguments[p.ParameterName], context.ModelState);
}
if (!context.ModelState.IsValid)
{
context.Response = context.Request.CreateResponse(
HttpStatusCode.BadRequest,
context.ModelState.Select(_ => new { Parameter = _.Key, Errors = _.Value.Errors.Select(e => e.ErrorMessage ?? e.Exception.Message) }),
context.ControllerContext.Configuration.Formatters.JsonFormatter
);
}
}
private void Validate(HttpParameterDescriptor p, object argument, ModelStateDictionary modelState)
{
var attributes = p.GetCustomAttributes<ValidationAttribute>();
foreach (var attr in attributes)
{
if (!attr.IsValid(argument))
modelState.AddModelError(p.ParameterName, attr.FormatErrorMessage(p.ParameterName));
}
}
}
我已经使用INSERT成功地将值插入了pid,question,risk1和commnent1中,但是,现在,我试图更新该表,在其中更新问题,risk1,comment1,risk2和comment2的值。我正在为所有这些添加空白列。这是我正在使用的代码,用于从数据库中检索数据并尝试更新字段。
pid, question, risk1, comment1, risk2, comment2
当我回显所有变量时,它们显示所需的值。
期望的结果是更新表中问题,风险1,注释1,风险2和注释2的所有值。
答案 0 :(得分:0)
首先,您的脚本完全打开以应对SQL注入攻击。
我个人建议为此使用PDO(而不是mysqli-它具有一个异常类来处理可能出现的任何问题),但这取决于您。但是,仍然需要需要正确地进行参数设置;如果有人将submittedvalue'; drop table review;--
作为POST参数传递,则您可能可以确切地知道会发生什么。
第二,您没有设置$pid
的值,因此MySQL将不进行任何更新。
这是一个使用mysql_i的(稍微更安全)的变体:
<?php
// include database connection
include 'config/database.php';
try {
$questions = $_POST['questions'];
$risk1 = $_POST['risk1'];
$risk2 = $_POST['risk2'];
$comment1 = $_POST['comment1'];
$comment2 = $_POST['comment2'];
$totalQuestion = sizeof($questions);
for ($i = 0; $i < $totalQuestion; $i++)
{
$pid = ''; //TODO: Set this variable
$InsertQuestion = $questions[$i];
$InsertRisk1 = $risk1[$i];
$InsertComment1 = $comment1[$i];
$InsertRisk2 = $risk2[$i];
$InsertComment2 = $comment2[$i];
$query = "UPDATE review SET question = ?,
risk1 = ?, comment1 = ?,
risk2 = ?, comment2 = ?
WHERE pid = ?";
$stmt = $con->prepare($query);
$stmt->bind_param("sssssi", $InsertQuestion, $InsertRisk1, $InsertComment1, $InsertRisk2, $InsertComment2, $pid);
$stmt->execute();
$stmt->close(); //Close the statement once we're done with it
}
}
catch(PDOException $exception)
{
die('ERROR: ' . $exception->getMessage());
}
?>
This article at PHP.net详细介绍了如何正确使用bind_param,但仅作总结:
用问号替换查询中的变量
参数1传递要嵌入到查询中的变量的数据类型。
参数2、3等是您自己传递实际变量的地方。这些字符的数量必须与参数1中传递的字符数量匹配。
顺序很重要。问号将替换为第一个参数,第二个替换为第二个,依此类推。
要进一步阅读,请查看This W3Schools article on connecting to MySQL和This W3Schools article on prepared statements