更新关联数组的列不起作用

时间:2019-04-09 09:08:02

标签: php mysql

我正在尝试更新审阅表中的两列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的所有值。

1 个答案:

答案 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传递要嵌入到查询中的变量的数据类型。

  • i =整数
  • d = Double
  • s =字符串
  • b = Blob-将以数据包形式发送

参数2、3等是您自己传递实际变量的地方。这些字符的数量必须与参数1中传递的字符数量匹配。

顺序很重要。问号将替换为第一个参数,第二个替换为第二个,依此类推。

要进一步阅读,请查看This W3Schools article on connecting to MySQLThis W3Schools article on prepared statements