【问题标题】:PHP mysqli prepare statements own classPHP mysqli 准备语句自己的类
【发布时间】:2018-06-06 05:26:50
【问题描述】:

我想写一个向数据库添加记录的方法。

我的方法:

final public function newData($sql, $placeholder, $array) {
  $stmt = $this->db->prepare($sql);
  $stmt->bind_param($placeholder, implode(",", $array));
  return $stmt->execute();
}

........

// Code---Example
$sql = "INSERT INTO table (name, data) VALUES (?,?)";

$placeholder =  "ss";

final public function newData($sql, $placeholder, [$array]) {
  $stmt = $this->db->prepare($sql);
  $stmt->bind_param($placeholder, implode(",", $array));
  return $stmt->execute();
 }

我的问题是如果我想用这种方法保存几个值。我收到警告

警告:mysqli_stmt::bind_param (): 类型定义字符串中的元素数与##中的绑定变量数不匹配

我做错了什么?

【问题讨论】:

  • 为什么这里有两个newData 方法?你用的是哪一个?
  • 第二种方法只是代码示例
  • 什么的示例?

标签: php mysqli prepared-statement


【解决方案1】:

你不能那样使用$stmt->bind_param()。您需要进行参数解包,因为 bind_param 需要类型,然后需要每个值作为参数。

final public function newData($sql, $placeholder, $array) {
    $stmt = $this->db->prepare($sql);
    $stmt->bind_param($placeholder, ...$array);
    return $stmt->execute();
}

然后使用like:

$sql = "INSERT INTO table (name, data) VALUES (?,?)";

$result = $theDbClass->newData($sql, 'ss', ['foo', 'bar']);

【讨论】:

  • 谢谢!这条线上的三个点是什么意思? $stmt->bind_param($placeholder, ...$array);他们做什么?没有这些要点,这种方法就行不通。我从来没有见过这样的东西! :-)
  • 这就是参数解包的作用,wiki.php.net/rfc/argument_unpacking - 对于pack()等函数也非常方便
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多