使用PHP在SQlite3中保存十进制值

时间:2018-01-18 15:47:29

标签: php sqlite prepared-statement

我正在使用PHP在Sqlite数据库中填充广告元素。 到现在为止一切都很好,但我现在意识到有时广告可以有一个十进制值,而不仅仅是一个整数。因此,我将价格字段的Sqlite结构从INTEGER修改为REAL并更改了我的PHP代码中的绑定值类型,但DB只是用0.0000000000000填充价格值。

这是我的PHP代码:

...
foreach ($ads as $advert) {
    ...
    $smtm = $bd->prepare("INSERT INTO ads (id, cat_id, supercat_id, price, oldprice, header, body, email, name, phone, date, image, hits, rating, promo_type, user_id, prov_id) VALUES (:id, :cat_id, :supercat_id, :price, :oldprice, :header, :body, :email, :name, :phone, :date, :image, :hits, :rating, :promo_type, :user_id, :prov_id)");
    $smtm->bindValue(':id', $final['id'], SQLITE3_INTEGER);
    $smtm->bindValue(':cat_id', $final['subcatid'], SQLITE3_INTEGER);
    $smtm->bindValue(':supercat_id', $final['cat'], SQLITE3_INTEGER);
    $smtm->bindValue(':price', $final['price'], SQLITE3_FLOAT); //Has to be decimal (8,2)
    $smtm->bindValue(':oldprice', $final['oldprice'], SQLITE3_FLOAT); //Has to be decimal (8,2)
    $smtm->bindValue(':header', $final['header'], SQLITE3_TEXT);
    $smtm->bindValue(':body', $final['body'], SQLITE3_TEXT);
    $smtm->bindValue(':email', $final['email'], SQLITE3_TEXT);
    $smtm->bindValue(':name', $final['nombre'], SQLITE3_TEXT);
    $smtm->bindValue(':phone', $final['phone'], SQLITE3_TEXT);
    $smtm->bindValue(':date', $final['date'], SQLITE3_TEXT);
    $smtm->bindValue(':hits', $final['hits'], SQLITE3_INTEGER);
    $smtm->bindValue(':promo_type', $final['promo_type'], SQLITE3_INTEGER);
    $smtm->bindValue(':image', $final['image'], SQLITE3_BLOB);
    $smtm->bindValue(':rating', $advert['average_rating'], SQLITE3_FLOAT);  //Has to be decimal (2,1)
    $smtm->bindValue(':user_id', $final['user_id'], SQLITE3_INTEGER);
    $smtm->bindValue(':prov_id', $final['prov_id'], SQLITE3_INTEGER);
    $smtm->execute();
    ...
}

这是我的Sqlite结构:

Sqlite3 Structure

我做错了什么?

1 个答案:

答案 0 :(得分:1)

根据文档中的this comment

  

在SQLite上使用REAL类型列时,请设置pdo参数   bindValue()的内容是PDO :: PARAM_STR。

$stmt->bindValue(':elapse_time', $e_time, PDO::PARAM_STR);

在您的代码中,您可以使用SQLite 方式SQLITE3_TEXT

$smtm->bindValue(':price', $final['price'], SQLITE3_TEXT);

不言而喻,但与其他人一样;)