对不起,如果有一些简单的, duh 解决方案,我没有看到,但它结束了一天,我的大脑已经累了。 ;)
我执行了很多查询,其中传递给我的(PDO)查询函数的变量可能包含值,或者是null
。
但是,由于您不能=
null
,我遇到的问题是,当我查找col_a = 'something' AND col_b = 'something_else'
时,我的查询工作正常,但当第二个值为null
时,同一个查询失败:col_a = 'something' AND col_b = null
。它应该是col_a = 'something' AND col_b IS null
。
为=
动态换出IS
会有什么好方法?
到目前为止,我提出的唯一解决方案是搜索=
,并在我注意到我在查询中添加null
值时手动将其换出(这在我的ReplaceParameters()
函数,我用它来模拟非准备查询的PDO参数替换功能。
然而,这只是感觉肮脏和低效。我非常感谢你的建议。
答案 0 :(得分:0)
我解决了我的问题。正如我在我的问题中提到的,我有一个ReplaceParameters()
函数,我用它来为未准备好的查询执行PDO样式的参数替换。
在该功能中,我已经遇到问题,即调用$this->m_connection->quote($value, PDO::PARAM_NULL)
会将''
替换为null
而不是my_column = ''
(因此您获得my_column = null
而不是$newQuery = preg_replace("/{$tempKey}\b/", "null", $newQuery);
)。
为了解决这个问题,我添加了正则表达式
$newQuery = preg_replace(["/\s+=\s+{$tempKey}\b/", "/\s+(!=|<>)\s+{$tempKey}\b/"], [" IS null", " IS NOT null"], $newQuery);
经过一点修改我最终得到了这个:
= :temp_key
第一个捕获/替换模式组合搜索IS null
并将其替换为!= :temp_key
。第二个捕获/替换模式搜索<> :temp_key
和IS NOT null
,并将其替换为=
。
编辑:我在上面的解决方案中还有一件事没有考虑到。将!=
<>
IS null
替换为IS NOT null
和WHERE
时,仅会在SET my_column = null
范围内条款。实际设置值时,语法仍为WHERE|where
。
我通过在我的正则表达式中添加负向lookbehind来解决这个问题,只替换$newQuery = preg_replace(["/(?<=WHERE|where)(.*)\s*(?<!!)=\s+{$tempKey}/", "/(?<=WHERE|where)(.*)\s*(!=|<>)\s+{$tempKey}\b/"], ["$1 IS null", "$1 IS NOT null"], $newQuery);
右侧的参数:
WHERE|where
剩下的是不在WHERE
块中的参数。我无法想出一个好的正则表达式(它也保持匹配不需要的部分),所以我寻求一个更简单的解决方案:找到null
子句的索引/位置(如果它存在),并提取任何剩余的东西将其作为子字符串,并用$whereIndex = stripos($newQuery, "WHERE");
if ($whereIndex !== false)
{
$newQuery = substr_replace($newQuery, preg_replace("/{$tempKey}\b/", "null", substr($newQuery, 0, $whereIndex)), 0, $whereIndex);
}
else
{
$newQuery = preg_replace("/{$tempKey}\b/", "null", $newQuery);
}
替换占位符。
<!-- Setting the listSelector to null removes the 5px border -->
<GridView
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:listSelector="@null" />
如果有人对这个最后一部分的基于正则表达式的解决方案有好主意,请告诉我。 如果有人要我解释我的正则表达式或其他什么,请再次告诉我。