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
参数不起作用。
答案 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();