【问题标题】:Binding values within a function to INSERT INTO DB将函数中的值绑定到 INSERT INTO DB
【发布时间】:2013-10-23 23:29:02
【问题描述】:

假设我有这个代码:

$array = array('one' => $one, 'two' => $two);
$sql->sql_insert('table_name', $array);

我有类对象$sql 和函数sql_insert,但是我将如何使用mysqli 准备好的语句来绑定值并将其插入到数据库中?假设mysqli connection$this->connection

任何建议都会非常感谢。

编辑:

function sql_insert_bind($table, $insert){

    $count = count($insert);
    $bind_val = '';
    for($i = 0; $i <= $count; $i++){

        $bind_val .= '?, ';
    }

    $query = $this->connection->prepare('INSERT INTO `'.$table.'` VALUES ('.substr($bind_val, 0, -2).')');

    foreach($insert as $key => $value){

        $query->bind_param($key, $value);
    }

    $query->execute();
}

我收到错误消息:Fatal error: Call to a member function bind_param() on a non-object$this-&gt;connection 是 mysqli 对象

【问题讨论】:

  • 查看编辑的代码以供我尝试。谢谢
  • 我知道您已经在使用 MySQLi,但在这种情况下使用 PDO 的 API 会更容易
  • 有什么更好的? PDO 还是 Mysqli?我现在正在重写我的 sql 类,所以这并不重要。你有PDO的样本吗?谢谢
  • 两者都不是更好。这真的取决于个人选择以及每个 API 与您要完成的任务的匹配程度。由于 PDO 支持命名参数,我认为在这种情况下它会很好地工作。请参阅我的答案以获取示例

标签: php arrays pdo mysqli


【解决方案1】:

你应该单独绑定每个变量,bind_param 将接受许多变量来绑定:

$array = array('one' => $one, 'two' => $two);
$query = $sql->prepare("INSERT INTO `table` VALUES (?, ?)");
$query->bind_param('ss', $array['one'], $array['two']);
$query->execute();
// inserted

【讨论】:

  • 这意味着sql_insert 方法需要知道通过$array 参数传入的参数。
【解决方案2】:

好的,这就是我将如何使用 PDO 来解决这个问题(因为 OP 要求)

我假设您已将 PDO 对象作为$connection 属性实例化或注入到您的类中,例如

class SQLClass {
    /**
     * @var PDO
     */
    private $connection;

    public function __construct(PDO $pdo) {
        $this->connection = $pdo;
    }

    // etc
}

$pdo = new PDO('mysql:host=localhost;dbname=db_name;charset=utf8', 'username', 'password', array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));

$sql = new SQLClass($pdo); 

然后,在您的 sql_insert_bind 方法中

$keys = array_keys($insert);

$cols = array_map(function($key) {
    return sprintf('`%s`', $key);
}, $keys);

$placeholders = array_map(function($key) {
    return sprintf(':%s', $key);
}, $keys);

$params = array_combine($placeholders, $insert);

$query = sprintf('INSERT INTO `%s` (%s) VALUES (%s)',
    $table, implode(',', $cols), implode(',', $placeholders));

$stmt = $this->connection->prepare($query);
$stmt->execute($params);

【讨论】:

  • 这会使用绑定函数来安全地保护这些值吗?比如不必手动转义值?
  • @Jay 是的。 PDOStatement::execute 绑定传递给它的参数。见php.net/manual/…
  • 这很好用。一件事。在我的数组中,一些值可以是“now()”或“NULL”或“”(无)。因为'now()'是我如何解决这个问题的时间?谢谢老哥
  • @Jay 您不能将参数用于NOW() 等静态值,尽管您可以使用null(即PHP null)和空字符串。您可以在 PHP 中创建一个日期/时间字符串,而不是使用 NOW()
  • 能否获得将now() 替换为当前时间的功能?我还应该在表名周围加上反引号吗?假设我移动到不同的数据库而不是 mysql,反引号会导致问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2021-10-01
相关资源
最近更新 更多