【问题标题】:SQL delete type doubleSQL 删除类型 double
【发布时间】:2015-11-11 18:47:44
【问题描述】:

我遇到了一些 sql 问题...下面有一个工作和不工作的例子。我对它们进行了硬编码,以便于查看。

$deleteData = $con->prepare("DELETE FROM markers WHERE sid=? AND user_id=? AND lat=? AND lng=?");
$deleteData->bind_param("iidd", $sid, $user_id,$lat,$lng);  

$sid= '239';
$user_id = '2';
$lat = '39.724869';
$lng = '-91.400116';

$deleteData -> execute(); 

当我尝试在 bind_param 中使用 double 类型进行删除时,某些原因不起作用。有什么建议么?我在 lat lng 周围用或不用 '' 都改变了它,仍然不起作用。

如果我把它改成下面,它删除就好了。

$deleteData = $con->prepare("DELETE FROM markers WHERE sid=? AND user_id=?);
$deleteData->bind_param("ii", $sid, $user_id);  

$sid= '239';
$user_id = '2';

$deleteData -> execute(); 

【问题讨论】:

  • “不起作用”,我假设您的意思是您没有收到错误,但您希望删除的记录实际上也没有被删除。准确吗?
  • 是的。没有错误,也没有删除任何内容...
  • 哪个 RDBMS?可能与您的系统文化有关。一些文化期望逗号作为小数分隔符。还有一个愚蠢的问题:你真的确定有适合所有 4 个参数的数据吗?
  • @Shnugo 感谢您的调查。当我与两个相同的值进行比较时,它受到公差(选择作为答案)的奇怪影响。但它起作用了。
  • @SQLNub,很高兴你能解决这个问题。处理浮点数可能很棘手:-)

标签: sql prepared-statement sql-delete


【解决方案1】:

首先你在第二个例子中有一个语法错误(缺少字符“)。

你也没有分配$sid变量。

然后我有一个有点愚蠢的问题。您是否知道,变量$blog_id, $user_id ... 等的分配必须在方法$deleteData->bind_param() 的调用之前?

另外,不要忘记,当您比较 2 个真实值时,您还应该添加一些容差,因此请尝试:

$deleteData = $con->prepare("DELETE FROM markers WHERE sid=? AND user_id=? AND ABS(lat - ?) < 0.0000001 AND ABS(lng - ?) < 0.0000001");

【讨论】:

  • 我在 $sid 部分的错误。我在发布之前更改了一些变量。宽容得到了它!即使具有相同的值,也不知道为什么它没有注册。谢谢!
  • 计算机使用二进制形式的实数(浮点数),只有 32 位或 64 位长。因此,实数可以存储几乎没有变化。例如。例如,数字 39.724869 可以实际存储为 39.7248690000001。因此,当您比较两个实数时,您还应该始终添加一些容差。此外,您正在使用 2 个独立的系统 PHP 和 MySQL,它们都可以以不同的方式处理实数。例如,在 PHP 中可以以 64 位格式存储实数,而在 MySQL 中,您将列 lat 和 lng 定义为 32 位数字。
  • 很好的解释。非常感谢。
【解决方案2】:

将$blog_id = '239';替换为$sid = '239';,因为这是您在bind_param() 语句中使用的变量名。

【讨论】:

  • 那是个错误。我忘了编辑它以显示实际问题。感谢收看。
猜你喜欢
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多