【问题标题】:How to construct a Joomla! query for matching two field values in a table?如何构建 Joomla!查询匹配表中的两个字段值?
【发布时间】:2017-09-12 15:33:48
【问题描述】:

我有一个表 #__newtoys_variants 有许多字段,其中 id 和 v_prod_id 都在那里。

现在虽然 id 是唯一的 - v_prod_id 是产品 id url显示产品信息和价格

example.com/index.php?option=com_newtoys&id=2&vid=7

这里 id 值是从 id 中提取的,vid 是从 db 表行中提取的 v_prod_id 对应的

这里有一个简单的表格举例

id v_prod_id v_price
1     7       200
2     7       220
3     1       250
4     1       270
5     2       300
6     10      350
7     9       220
8     7       195

现在我打算在前端显示 404 错误/500 错误/页面不存在 - 如果前端 url 中的 id 和 v_prod_id 不匹配

万一用户更改网址说

example.com/index.php?option=com_newtoys&id=2&vid=1

然后想在前端显示404错误/500错误/页面不存在 这是表数据库 任何人都可以帮助它实现相同的目标

这是一个简短的函数 - 不确定 sql 查询或函数中究竟应该是什么,以便 id 和 v_prod_id 应该像数组一样匹配,如果结果为零,则可以显示错误消息

function loadProduct($id ,$vid){
    $mainframe =JFactory::getApplication();
    $option = JRequest::getCmd('option');
    $db =JFactory::getDBO();
    global $Itemid; 
    $sql = "";

    $db->setQuery($sql);

if ($rows = $db->loadObjectlist()) {
return $rows[0];

} else {
  if ($db->getErrorNum()) {
    JError::raiseError(500, "Something went horribly wrong, the query returned the error ". $db->getErrorMsg());

  } else {
 JError::raiseError(404, "404, Page does not Exists ". $db->getErrorMsg());
  }
}       
    }

任何人都可以提供帮助和建议。赏金已添加

【问题讨论】:

  • 指南做错误。您需要检查 vid=7 值是否在数据库中匹配(代码 sql 查询以检索它是否匹配),如果不匹配您需要显示错误.. 就是这样
  • 是的 - 我知道需要编写 sql 查询来检查 v_prod_id 是否与相应的 id 字段匹配。如果不是,则如上所述的错误功能。但是我在 sql 查询中很天真 - 所以如果可以提供同样的帮助。谢谢
  • 对不起,Ruchika 我不明白。你的意思是我要编写检查 prod_id 的代码吗?
  • 我知道它不是一个要求编写代码的论坛,但是如果可以帮助提供sql查询以达到预期的效果,可以。
  • 对我来说这不是问题,我可以重写或编码一些东西:) 所以让我在 php pdo 中给你一个答案来查询 sql 以检查 vproid 与相应的 id 匹配还是你想显示错误?还是直接忽略?

标签: php mysql sql joomla select-query


【解决方案1】:

试试这个:

function loadProduct($id, $vid){
  $mainframe = JFactory::getApplication();
  $option = JRequest::getCmd('option');
  $db = JFactory::getDBO();
  $query = $db->getQuery(true);
  $query->select('id, v_prod_id');
  $query->from($db->quoteName('#__newtoys_variants'));
  $query->where($db->quoteName('id')." = ".$db->quote($id), 'AND');
  $query->where($db->quoteName('v_prod_id')." = ".$db->quote($vid));
  $db->setQuery($sql);

  if ($rows = $db->loadObjectlist()) {
    return $rows[0];
  } else {
    if ($db->getErrorNum()) {
      JError::raiseError(500,
       "Something went horribly wrong, the query returned the error ". $db->getErrorMsg());
    } else {
      JError::raiseError(404,
       "404, Page does not Exists ". $db->getErrorMsg());
    }
  }
}

更多详情请看这里:

https://docs.joomla.org/Selecting_data_using_JDatabase

更新

您在 cmets 中要求 Joomla!以下查询的翻译:

Select *, (select prod_name from #__newtoy_products where id=v.id) as prod_name
from #__newtoys_variants AS v Where v.state='1' and v.id = '".$v_prod_id."'

...与此基本相同:

SELECT v.*, p.prod_name
FROM #__newtoys_variants AS v
LEFT JOIN #__newtoy_products AS p
ON p.id = v.id
WHERE v.state='1' and v.id = '".$v_prod_id"'

...应该映射到 Joomla! 中的类似内容:

$query->select(array('v.*', 'p.prod_name'))
      ->from($db->quoteName('#__newtoys_variants', 'v'))
      ->join('LEFT', $db->quoteName('#__newtoy_products', 'p'))
      . ' ON (' . $db->quoteName('p.id') . ' = ' . $db->quoteName('v.id') . ')')
      ->where($db->quoteName('v.state')." = ".$db->quote(1), 'AND')
      ->where($db->quoteName('v.id')." = ".$db->quote($v_prod_id));

【讨论】:

  • 太棒了 - 我认为它几乎接近了,如果将上面的查询与这个 "Select *, (select prod_name from #__newtoy_products where id=v.id) as prod_name from #__newtoys_variants AS v Where v.state='1' and v.id = '".$v_prod_id."'" 合并,只需要更多。如何将查询重写为单个合并查询。这将有助于实现期望的目标
  • 谢谢 - 它现在显示 Parse error: syntax error, unexpected 'v' on this line ->where($db->quoteName('v.state')." = ".$db->quote(1), 'AND') 。此外,一旦这个解析错误问题得到解决,我可以简单地加入新查询和旧查询
  • 好吧,我确实说过“类似这样的事情” - 希望这足以为您指明正确的方向,而无需逐步排除故障,因为这对您来说可能比我更容易,因为我没有没有 Joomla!安装在本地...如果文档不够,可能会问一个单独的 SO 问题?此处描述了连接语法:docs.joomla.org/…
  • 我明白。你已经为我指出了正确的方向,只是最后一个指针 - 为什么 id 会变得明确 - Column 'id' in field list is ambiguous SQL=SELECT id, v_prod_id,v.*,p.prod_name FROM #__new#__variants,#__new#__variants` AS v LEFT JOIN #__new#__products AS p ON ( p.id = v.v_prod_id) 其中id = '188' AND v_prod_id = '12' AND v.state = '1' AND @98765432 987654343@ = '188'`。我应该纠正什么代码
  • 使用表别名后能够解决。谢谢 - 您的解决方案运行良好,非常感谢您指出正确的方向 - 它也确实帮助我学习了同样的方法
【解决方案2】:

检查 v_prod_id 匹配的示例代码

<?php
//connection
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "";
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }
if(isset($_GET['id']) && ($_GET['vid'])){
//sanitize the id and vid i didnt sanitized
$id = $_GET['id'];
$vid = $_GET['vid'];
//Coded by Ajmal PraveeN
                                        $sqlq = $conn->prepare("SELECT id, v_prod_id FROM __newtoys_variants WHERE id= :id");
                                        $sqlq->bindValue(':id', $id);
                                        $sqlq->execute();
                                        $row = $sqlq->fetch(PDO::FETCH_ASSOC);
//if you want to check the id whether it matches? remove the comment line and check the id matches
if(/*($id !== $row['id']) && */($vid !== $row['v_prod_id'])){
echo 'v prod id error';
}
?>

【讨论】:

  • sorry doesn't work bind function error then execute error 然后 fetch error.
  • 能否给我错误截图?我给了你一个示例代码来检查 get 的 db prod 匹配,你需要根据需要实现你的主脚本。你的服务器有pdo驱动吗?如果不安装它
猜你喜欢
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多