PostgreSQL中的预备语句,字符串和数字

时间:2015-09-13 10:54:04

标签: php postgresql

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参数不起作用。

1 个答案:

答案 0 :(得分:0)

我已根据新评论修改了我的答案,您需要检测已提供的数据格式。这很棘手,因为看起来您的数据总是以字符串形式出现,即使字符串包含原始整数。

执行此操作的草率方法是执行快速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();