Drupal 为什么db_占位符为我的查询返回空字符串?
我在查询中使用db_占位符替换字符串数组Drupal 为什么db_占位符为我的查询返回空字符串?,drupal,drupal-6,Drupal,Drupal 6,我在查询中使用db_占位符替换字符串数组 $paths = array("commentary_analysis/18", "commentary_analysis/16", "commentary_analysis/95", "commentary_analysis/89"); $query = "SELECT DISTINCT a.uid, u.mail FROM {alerts} a JOIN {users} u on u.uid = a.uid WHERE u.mail IS NOT
$paths = array("commentary_analysis/18", "commentary_analysis/16", "commentary_analysis/95", "commentary_analysis/89");
$query = "SELECT DISTINCT a.uid, u.mail FROM {alerts} a JOIN {users} u on u.uid = a.uid WHERE u.mail IS NOT NULL AND u.mail != '' AND u.status = 1 AND a.status = %d AND a.view_path IN (" . db_placeholders($paths, 'text') . ") ORDER BY a.uid ASC";
$users_to_notify = db_query($query, $alert_status, $paths);
当我知道应该返回结果时,查询没有返回结果。我调试了查询以查看正在运行的确切查询。正在运行的查询是
SELECT DISTINCT a.uid, u.mail FROM alerts a JOIN users u on u.uid = a.uid WHERE u.mail IS NOT NULL AND u.mail != '' AND u.status = 1 AND a.status = 1 AND a.view_path IN ('','','','') ORDER BY a.uid ASC
请注意,a.view\u路径位于(“”、“”、“”、“”)
。这就是问题所在。从我所看到的情况来看,我希望db_占位符使用正确的语法
有人能告诉我为什么我使用db_占位符返回
('','','','')
而不是(“评论分析/18”,“评论分析/16”,“评论分析/95”,“评论分析/89”)
首先,在Drupal 7中禁止使用dB占位符,因此您应该考虑不使用它。这是一种浪费内存的功能
尝试使用varchar数据类型:
$query = "SELECT DISTINCT a.uid, u.mail FROM {alerts} a JOIN {users} u on u.uid = a.uid WHERE u.mail IS NOT NULL AND u.mail != '' AND u.status = 1 AND a.status = %d AND a.view_path IN (" . db_placeholders($paths, 'varchar') . ") ORDER BY a.uid ASC"
$query=“从{alerts}中选择不同的a.uid、u.mail,然后在u.uid=a.uid上加入{users}u,其中u.mail不为NULL,u.mail!=''和u.status=1,a.status=%d和a.view_路径(“.db_占位符($path,'varchar')”)按a.uid ASC排序”
在查询中交换db_查询修饰符的顺序可以修复此问题
$query = "SELECT DISTINCT a.uid, u.mail FROM {ifrmarkets_alerts} a JOIN {users} u on u.uid = a.uid WHERE u.mail IS NOT NULL AND u.mail != '' AND a.view_path IN (" . db_placeholders($paths, 'varchar') . ") AND u.status = 1 AND a.status = %d ORDER BY a.uid ASC";
$users_to_notify = db_query($query, $paths, $alert_status);
问题是,您可以将所有单值参数传递给db_query,也可以传递一个参数数组。您的代码先传递一个值,然后传递一个数组,Drupal就没有那么灵活了 试试这个:
$paths = array(
'commentary_analysis/18',
'commentary_analysis/16',
'commentary_analysis/95',
'commentary_analysis/89',
);
$query = "SELECT DISTINCT a.uid, u.mail
FROM {alerts} a
JOIN {users} u on u.uid = a.uid
WHERE u.mail IS NOT NULL
AND u.mail != ''
AND u.status = 1
AND a.status = %d
AND a.view_path IN (" . db_placeholders($paths, 'varchar') . ")
ORDER BY a.uid ASC";
$args = array_merge(array($alert_status), $paths);
$users_to_notify = db_query($query, $args);
否则,如果不使用db_占位符,如何在Drupal6中使用“IN”(“text”、“text”、“text”)”运行查询?为什么您希望“varchar”的工作方式与“text”不同?虽然我同意应该使用“varchar”,但如果这是我尝试的唯一改变,我也不会期望行为会有所不同。我确实尝试过用“varchar”替换,得到了相同的结果。“text”应该可以很好地工作,尽管“varchar”可能是合适的类型。问题是将参数传递给函数。