【问题标题】:php error: SQLSTATE[HY093]: Invalid parameter number: parameter was not definedphp 错误:SQLSTATE[HY093]:参数号无效:参数未定义
【发布时间】:2019-02-11 07:21:03
【问题描述】:

我正在使用 php 和 mssql (sql server) 为我的项目制作 API。我写了这段代码,但它给了我错误。我检查了参数和值,但看不到问题。任何帮助,将不胜感激。 错误是这样的: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\wamp\www\sarfeh\api\objects\user.php on line 40 我在下面的代码中标记了第 40 行。 Ans 这就是 $hash 所拥有的: $2y$10$BTog4ZdjkrDsH9Hw/FjuD.myHiz61o6SOUDy4KuvoB2dGDQV9Vl4u

编辑: 如果我在没有散列(11111)的情况下传递密码,这可以工作,但使用散列我得到错误。

函数创建(){

    /
    // insert query
    $query = "INSERT INTO " . $this->table_name . "
    (first_name,last_name,phone,password_hash)
    values (:first_name,:last_name,:phone,':password')";

    /$this->first_name="arassssh2";
    $this->last_name="arasssh2";
    $this->phone="326981";
    $this->password="111111";
    // prepare the query
    $stmt = $this->conn->prepare($query);
    // bind the values
    $stmt->bindParam(':first_name', $this->first_name, PDO::PARAM_STR);
    $stmt->bindParam(':last_name', $this->last_name, PDO::PARAM_STR);
    $stmt->bindParam(':phone', $this->phone, PDO::PARAM_STR);
    $hash = password_hash($this->password, PASSWORD_BCRYPT);
    $stmt->bindParam(':password', $hash); //line 40


    // execute the query, also check if query was successful
    if($stmt->execute()){
        return true;
    }

    return false;

}

【问题讨论】:

  • 删除' 前后:password。将 `(:first_name,:last_name,:phone,':password')` 更改为 `(:first_name,:last_name,:phone,:password)`。
  • 为什么在查询中提供':password'?请参阅此以获取更多信息w3schools.com/php/php_mysql_prepared_statements.asp

标签: php sql-server pdo


【解决方案1】:

您不需要用' 将参数名称括起来。在:password 前后删除'。改变

$query = "INSERT INTO " . $this->table_name . "
    (first_name,last_name,phone,password_hash)
    values (:first_name,:last_name,:phone,':password')
"; 

 $query = "INSERT INTO " . $this->table_name . "
    (first_name,last_name,phone,password_hash)
    values (:first_name,:last_name,:phone,:password)
";

【讨论】:

  • 我删除了 ' ,错误更改为:未捕获的 PDOException: SQLSTATE[22001]: [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]字符串或二进制数据将被截断。
  • @ArashMohammadi 您的$hash 可变长度大于 SQL Server 中的列宽。
  • 谢谢!这就是问题所在!在 Sql Server 中,password_hash 字段为 50,将其更改为 250,它就可以工作了!谢谢你救了我几个小时!
【解决方案2】:

我认为line 40 应该是:

 $stmt->bindParam(':password', $hash, PDO::PARAM_STR);

【讨论】:

  • @Zhorov 的答案为我解决了这个问题,但感谢您提醒我参数类型。
  • 如果对答案有任何帮助,您可以考虑投票:)
猜你喜欢
  • 2022-08-05
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2022-01-10
  • 2012-06-13
相关资源
最近更新 更多