【问题标题】:Mysqli INSERT not working unless all columns are present除非所有列都存在,否则 Mysqli INSERT 不起作用
【发布时间】:2016-02-04 01:03:06
【问题描述】:

我在一个网站上工作,我刚刚将它的数据库从运行 CentOS 6 的服务器移动到运行 CentOS 7 的服务器,现在我的查询不起作用,除非查询中的所有列都存在。

$sql = 'INSERT INTO users(name, user, huser, hpass, mail, salt) VALUES (?, ?, ?, ?, ?, ?)';

/* Prepare statement */
$stmt = $conn->prepare($sql);
if($stmt === false) {
  trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->errno . ' ' . $conn->error, E_USER_ERROR);
}


/* Bind parameters. Types: s = string, i = integer, d = double,  b = blob */
$stmt->bind_param('ssssss', $name, $user, $huser, $hpass, $email, $salt);

/* Execute statement */
$stmt->execute();
mysqli_close($conn);
echo "Register succeeded! Please wait...";

此脚本运行良好,唯一的更改是 mysql 服务器地址和凭据。如果我添加一些虚拟变量并完成查询中的所有列,它就可以正常工作。

这是我需要更改的设置吗?我想尽量减少查询,稍后将使用空列。这是不好的做法吗?更换服务器打破了这一事实让我认为这要么是 mysqli 版本的不同,要么是 mysqld 的配置。

【问题讨论】:

  • 你真的不应该在密码哈希上使用你自己的盐,你真的应该使用 PHP 的 built-in functions 来处理密码安全。如果您使用的 PHP 版本低于 5.5,则可以使用 password_hash() compatibility pack
  • 你没有执行你的查询。
  • 如果与此查询相关的所有代码@JayBlanchard 都是正确的。
  • @JayBlanchard 这只是一个错误,忘记复制执行。正如我在OP中所说,如果我将数据库切换到旧数据库,代码可以正常工作,所以它一定是配置或版本问题。

标签: php mysql mysqli centos


【解决方案1】:

这个脚本运行良好

我觉得这很难相信。您已指定 10 个属性中的任何一个都不能为空,只有 2 个具有默认值(id、访问权限),并且您的脚本仅在 INSERT 上设置了 6 个值。

如果您已指定一个值不得为 NULL,那么您必须指定一个默认值或设置一个值。

如果脚本在旧服务器上运行,它必须具有与上述不同的架构。

【讨论】:

  • 可能,两个数据库都是使用 phpmyadmin 创建的。我将设置默认值并报告
  • 当缺少的列默认设置为 NULL 时,查询工作正常。我猜旧服务器有一个不同的 phpmyadmin 设置,可能是对你所说的架构进行了修改。
猜你喜欢
  • 2013-12-31
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多