我正在使用这段代码,我感到非常沮丧:
try {
$dbh = new PDO('mysql:dbname=' . DB . ';host=' . HOST, USER, PASS);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
}
catch(PDOException $e)
{
...
}
$stmt = $dbh->prepare('INSERT INTO table(v1, v2, ...) VALUES(:v1, :v2, ...)');
$stmt->bindParam(':v1', PDO::PARAM_NULL); // --> Here's the problem
Run Code Online (Sandbox Code Playgroud)
PDO::PARAM_NULL, null, '', 所有这些都失败并抛出此错误:
致命错误:无法通过/ opt /中的引用传递参数2
这似乎是常识使用mysql_set_charset/ mysqli::set_charset,而不是直接的MySQL查询的set names.
经常被引用的原因set names是不安全,因为用于mysql_real_escape_string/ 的编码mysqli::real_escape_string只能通过调用mysql_set_charset/ 来设置mysqli::set_charset.(引用的另一个原因是PHP文档说它"不推荐" §.)
但是,set names如果我们使用预备语句和mysql_real_escape_string/mysqli::real_escape_string或除了// 之外的其他逃逸方法,使用直接MySQL查询是否安全mysqli_escape_string?
除了影响mysql_real_escape_string/ mysqli::real_escape_string/ 的编码, vs/?mysqli_escape_string之间有什么区别吗?set namesmysql_set_charsetmysqli::set_charset
使用PHP PDO for mysql更新具有空值的非可空字段时,我无法生成错误或异常.直接sql给出了预期的错误.
来自PDO的所有内容都会导致status_id字段的值设置为0,而不是异常或错误,表示该字段不允许为null.
$stmt_handler = $this->db_handler->prepare(
"UPDATE faxes SET metadata = :metadata, status_id = :status_id,
created = :created, updated = :updated, content = :content,
vendor_fax_id = :vendor_fax_id WHERE id = :id");
$stmt_handler->bindParam(':id', $fax->id);
$stmt_handler->bindParam(':metadata', $fax->metadata);
$stmt_handler->bindParam(':status_id', $fax->status_id); // tried different combinations
$stmt_handler->bindParam(':created', $fax->created);
$stmt_handler->bindParam(':updated', $fax->updated);
$stmt_handler->bindParam(':content', $fax->content);
$stmt_handler->bindParam(':vendor_fax_id', $fax->vendor_fax_id);
$stmt_handler->execute();
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的组合并将PDO :: ATTR_EMULATE_PREPARES设置为false(正如此问题所建议的那样,PHP mysql PDO拒绝设置NULL值)
我的原始绑定:
bindParam(':status_id', $fax->status_id);
Run Code Online (Sandbox Code Playgroud)
尝试过
bindValue(':status_id', null, PDO::PARAM_INT);
bindValue(':status_id', null, PDO::PARAM_NULL);
bindValue(':status_id', 'NULL', PDO::PARAM_INT);
bindValue(':status_id', 'NULL', PDO::PARAM_NULL);
bindValue(':status_id', null);
bindValue(':status_id', …Run Code Online (Sandbox Code Playgroud)