【问题标题】:MySql SELECT multiple according to form input and publishMySql SELECT 多个根据表单输入和发布
【发布时间】:2019-02-09 00:23:47
【问题描述】:

我需要完成mysql_query SELECT 多个选项并在网页上发布结果。表单(Breezingforms)拉取数据。

Joomla 模块出现在网页上

<div id="frmSrchResults"></div>

表单上的“搜索”按钮,用户可以选择从数据库中提取数据

    function ff_Searchbutton_action(element, action)
{
    switch (action) {
        case 'click':
let var1 = ff_getElementByName('category').value;
let var2 = ff_getElementByName('subcategory').value;
let var3 = ff_getElementByName('CselCountry').value;

// call the .post
jQuery.ajaxSetup({async:false});
jQuery.post(
  '<?php return JUri::root(true); ?>/index.php', {
    option: 'com_breezingforms',
    ff_form: ff_processor.form,
    format: 'html',
    category: var1,
    subcategory: var2,
    country: var3
},
//  success: function(data) {
  function(data) {
    jQuery('#frmSrchResults').html(data);

);
            break;
        default:;
    } // switch
} // ff_Searchbutton_action

在形式前的形式

$this->execPieceByName('ff_InitLib');

// fetch .post() parameters
$var1 = JRequest::getVar('par1');
$var2 = JRequest::getVar('par2');

if ($var1 && $var2 && $var1 !== '' && $var2 !== '') {
  $db = JFactory::getDBO();
  $db->setQuery("Query I need to complete");
  $result = $db->loadAssocList();

// clean output buffer
  while (@ob_get_level() > 0) { @ob_end_clean(); }

  echo $result;
  exit;
}

这是一个数据库结构的例子

id  title            name           value
4   Company Name     companyname    Microsoft
4   Company Address  companyaddress someaddress
4   Country          country        USA
4   Category         category       Computer
4   Sub-category     subcategory    Software
5   Company Name     companyname    Apple
5   Company Address  companyaddress someaddress2
5   Country          country        CANADA
5   Category         category       Business
5   Sub-category     subcategory    Executive
6   Company Name     companyname    Ollivetti
6   Company Address  companyaddress someaddress3
6   Country          country        CANADA
6   Category         category       Business
6   Sub-category     subcategory    Executive

例如表单中的用户输入:

Category=Business
Sub-category=Executive
Country=CANADA

现在我需要:选择值(根据用户在表单上的选择。每个表单元素都是一个选择列表)FROM 表等。所以在我的示例中,结果应该是这样的:

Company Name        Company Address 
Apple               someaddress2    
Ollivetti           someaddress3    

【问题讨论】:

  • 如果用户可以输入BusinessExecutiveCANADA,为什么您只将categorysubcategory 传递给您的ajax 进程?
  • 对于未来与 Joomla 相关的问题,请在 Joomla Stack Exchange 中发帖(出于多种原因)。 1. 它使社区保持活跃。 2.您可能会收到非 Joomla 用户无法提供的其他最佳实践建议。
  • 谢谢@mickmackusa。你是对的,我也应该包括 Country。
  • @mickmackusa 我一定在某个地方错过了它。你是对的,它应该在 Joomla 下!

标签: javascript jquery mysql joomla breezingforms


【解决方案1】:

我假设您运行的是过时版本的 Joomla,因为 JRequest has been deprecated as of Joomla 3.xJoomla 3.3 deprecated function for JRequest::getVar() 所以您应该尽快升级。

现代语法:

$jinput = JFactory::getApplication()->input;
$category = $jinput->get->post('par1', '', 'WORD');
$subcategory = $jinput->get->post('par2', '', 'WORD');
$country = $jinput->get->post('par3', '', 'WORD');

然后你可以这样写你的条件:

if ($category && $subcategory && $country) {

您的查询将需要使用“枢轴”对关联的行进行分组; here is a solution that I posted on Joomla Stack Exchange that implements a pivot.

SQL 搜索BusinessExecutive:(db-fiddle demo)

SELECT 
    MAX(CASE WHEN `name` = 'companyname' THEN `value` ELSE NULL END) AS `Company Name`,
    MAX(CASE WHEN `name` = 'companyaddress' THEN `value` ELSE NULL END) AS `Company Address`
FROM `ucm`
GROUP BY `id`
HAVING
    MAX(CASE WHEN `name` = 'category' THEN `value` ELSE NULL END) = 'Business'
    AND MAX(CASE WHEN `name` = 'subcategory' THEN `value` ELSE NULL END) = 'Executive'
    AND MAX(CASE WHEN `name` = 'country' THEN `value` ELSE NULL END) = 'CANADA'
ORDER BY `Company Name`;

使用输入变量将此原始 SQL 转换为 Joomla 方法语法,如下所示:

$db = JFactory::getDbo();
$query = $db->getQuery(true)
    ->select([
        "MAX("
        . "CASE WHEN name = " . $db->q("companyname")
        . " THEN value ELSE NULL END"
        . ") AS " . $db->qn("Company Name"),
        "MAX("
        . "CASE WHEN name = " . $db->q("companyaddress")
        . " THEN value ELSE NULL END"
        . ") AS " . $db->qn("Company Address")
    ])
    ->from($db->qn("#__your_ucm_table"))
    ->group("id")
    ->having([
        "MAX("
        . "CASE WHEN name = " . $db->q("category")
        . " THEN value ELSE NULL END"
        . ") = " . $db->q($category),
        "MAX("
        . "CASE WHEN name = " . $db->q("subcategory")
        . " THEN value ELSE NULL END"
        . ") = " . $db->q($subcategory),
        "MAX("
        . "CASE WHEN name = " . $db->q("country")
        . " THEN value ELSE NULL END"
        . ") = " . $db->q($country)
    ])
    ->order($db->qn("Company Name"));

try
{
    $db->setQuery($query);
    if (!$results = $db->loadAssocList())
    {
        echo "No matches found";
    }
    else
    {
        echo "<table>";
            echo "<tr><th>", implode("</th><th>", array_keys($results[0])), "</th></tr>";
            foreach ($results as $row)
            {
                echo "<tr><td>", implode("</td><td>", $row), "</td></tr>";
            }
        echo "</table>";
    }
}
catch (Exception $e)
{
    JFactory::getApplication()->enqueueMessage("<div>Query Syntax Error, ask dev to run diagnostics</div>", 'error');
    // Don't show the following details to the public:
    //echo $query->dump();
    //echo $e->getMessage();
}

附言请记住,您不能简单地 echo 您的 loadAssocList 数据。


至于您的 jquery,我相信您缺少调用的 success 块。

success: function (data) {
    jQuery('#frmSrchResults').html(data);
},
error: function (xhr, status) {
    console.log("Bonk! Time to debug.");
}

这里是一些上下文:https://stackoverflow.com/a/20008285/2943403

【讨论】:

  • 我试过了,但由于某种原因它不起作用。在关注Try/catch syntax 之类的文章后,我注意到一个想法是 MySQL 中不存在 Try/Catch?这可能是它不起作用的原因吗?
  • 我在本地主机上测试了我的查询 sn-p 以在发布之前成功。如果某些东西不起作用,那么您将需要运行诊断以确定最早的故障点。开始回显您希望看到的值。如果$category$subcategory 没有提供您在表单中键入的内容,那么您遇到了html/javascript 问题。如果您正在测试您的代码,您可以取消注释 getMessage() 行以查看 mysql 错误。如果您想检查查询,请在 try 块之前编写 `dump()` 并在您的 phpMyAdmin 中测试呈现的查询。
  • 您确实在我的查询中更改了表的名称,对吧?当然,-&gt;from($db-&gt;qn("#__your_ucm_table")) 对您不起作用,除非您有一个名为 lmnop_your_ucm_table 的表。
  • 感谢@mickmackusa,非常感谢您的帮助!
  • 是的,我确实更改了表名。谢谢
猜你喜欢
  • 2016-11-16
  • 1970-01-01
  • 2021-08-28
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 2015-03-23
相关资源
最近更新 更多