【问题标题】:Prepared statement in PostgreSQL, string and numberPostgreSQL中的准备语句,字符串和数字
【发布时间】:2015-12-09 12:25:51
【问题描述】:

php代码:

$con = new PDO($this->dsn, $this->login, $this->password);
$stmt = $con->prepare($selectSql);

$stmt->execute(array(
  'login'    => $login
));

和sql查询:

$selectSql = 'SELECT id 
              FROM public.users 
              WHERE (numberType = :login OR stringType = :login)';

问题是我认为编辑 PHP 代码并向示例 'loginNumber' => (int) $login 添加新变量并不可取。

我该如何解决它,以便SQL 搜索结果本身被转换为数值?

numberType = (:login)::Integer 参数不起作用。

【问题讨论】:

  • 抱歉,又是什么问题?
  • 什么意思?你不清楚。
  • 我需要在 sql 查询中预先判断 2 种不同的类型:login。 :login 可以是数字和字符串。现在查询没有执行,并且嘲笑该类型的数据不正确。
  • 您可能对这个非常相似的问题的答案感兴趣:stackoverflow.com/questions/31643297/…

标签: php postgresql


【解决方案1】:

鉴于新的 cmets,我已经修改了我的答案,您需要检测提供的数据格式。这很棘手,因为您的数据似乎总是以字符串形式出现,即使字符串包含原始整数。

执行此操作的草率方法是进行快速 is_numeric 检查...但这会将任何数值解析为 true...甚至浮动?最重要的是,变量绑定在 PDO 中默认采用字符串,要绑定任何其他内容,您必须详细定义它。

这里有一些松散的代码给你一个想法,但你可能需要改进 $isNumericLogin 逻辑以获得更准确的数字非整数登录值的结果。

$con = new PDO($this->dsn, $this->login, $this->password);

// Generate correct query given the data format
$isNumericLogin = is_numeric($login);
$selectSql = $isNumericLogin ?
    'SELECT id FROM public.users WHERE number = :login' :
    'SELECT id FROM public.users WHERE string = :login';

$stmt = $con->prepare($selectSql);

// Bind the correct data format based
$isNumericLogin ?
    $stmt->bindValue('login', $login, PDO::PARAM_INT) :
    $stmt->bindValue('login', $login);

$stmt->execute();

【讨论】:

  • :login 可以是字符串和数字。 A PDO::PARAM_INT 总是转换为 int
  • 如果您的参数是浮点/十进制类型,那么您就有问题了。您的数据库中的“数字”是什么数据格式?有关您的问题的更多信息,请参见此处:stackoverflow.com/questions/1335081/…
猜你喜欢
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2014-07-10
  • 2020-09-28
  • 2014-02-05
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多