MySQL:动态交换" =:value"在查询" IS:值"

时间:2015-11-24 16:42:21

标签: php mysql pdo

对不起,如果有一些简单的, 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参数替换功能。

然而,这只是感觉肮脏和低效。我非常感谢你的建议。

1 个答案:

答案 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_keyIS NOT null,并将其替换为=

编辑:我在上面的解决方案中还有一件事没有考虑到。将!= <> IS null替换为IS NOT nullWHERE时,会在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" />

如果有人对这个最后一部分的基于正则表达式的解决方案有好主意,请告诉我。 如果有人要我解释我的正则表达式或其他什么,请再次告诉我。