【问题标题】:PDO prepared statement insert not workingPDO 准备好的语句插入不起作用
【发布时间】:2017-07-05 16:32:24
【问题描述】:

我完全不知道为什么这个准备好的语句不起作用返回 false 但没有给我任何错误。我在 StackOverflow 上阅读过类似的问题,但我没有找到任何提示来解决这个未知问题。

错误被激活

public function PDOconn() {
    try {
        return new PDO($this->getDsn(), $this->username, $this->password, [PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION]);
    } catch (PDOException $e) {
        echo "Errore di connessione al database";
        throw $e->getCode();
    }
}

这是处理 AJAX 请求的 PHP 文件。我将查询插入到try {} ... catch(),但实际上并没有帮助,因为它没有报告任何错误。 execute() 只返回false

/* ***** CLASSES AUTOLOAD fn ***** */
spl_autoload_register(function ($class_name) {
    require_once '../classes/' . $class_name . '.php';
});

$db     = new database();
$conn   = $db->PDOconn();


$name   = postGet::post('name');
$email  = postGet::post('email');
$commercial = postGet::post('commercial');


try {
    $stmt = $conn->prepare('INSERT INTO newsletter_subscription(name, email, commercial) VALUES(:name, :email, :commercial)');
    $stmt->execute(array(':name' => $name, ':email' => $email, ':commercial' => $commercial));
} catch (PDOException $e) {
    $return = $e->getCode();
}

header('Content-Type: application/json; charset=utf-8');
echo json_encode($return);

变量string $namestring $emailint $commercial正确传递,我将它们打印到php文件中。

这是 subscriptorID 是 PRIMARY AI 并且 email 是 UNIQUE 的表结构

[解决方案] 对我和我短暂的记忆感到羞耻,但也许它可以帮助其他人:我有那个 DB 用户没有 INSERT 权限的闪存,这就是为什么查询只返回false 没有任何错误。

【问题讨论】:

  • 您是否收到任何错误消息?

标签: php mysql pdo sql-insert


【解决方案1】:

啊,我看到commercial 是一个布尔值。

当你使用这种传参方式时,参数都被假定为字符串。

$stmt->execute(array(':name' => $name, ':email' => $email, ':commercial' => $commercial));

如果是布尔值,您可能必须像这样绑定值。

$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->bindValue(':email', $email, PDO::PARAM_STR);
$stmt->bindValue(':commercial', $commercial, PDO::PARAM_BOOL);

$stmt->execute();

【讨论】:

  • 我的错,$commercial 现在是int。无论如何,我尝试按照您的建议手动绑定参数(使用PDO::PARAM_INT),但它仍然不起作用,它仍然没有打印任何错误消息
【解决方案2】:

bool $commercial 作为整数而不是布尔值传递。在您的 sql 中将其更改为布尔值,即 TrueFalse

【讨论】:

  • 这是我的错,是int $commercial。但无论如何,据我所知,在 MySQL 中 INT(1) 被认为是 BOOLEAN
  • 删除它,看看是否是问题所在。
猜你喜欢
  • 2018-01-24
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多