【问题标题】:Trying to seperate SQL results so I can change price by percentage尝试分离 SQL 结果,以便我可以按百分比更改价格
【发布时间】:2021-06-29 11:44:22
【问题描述】:

我有一个 SQL 搜索和结果页面,它提供了 3 列数据:类别、数量和价格。结果以一大块返回。我希望能够有一个包含百分比的下拉列表,然后单击其中一个数字会将价格更改该百分比。试图弄清楚如何分离结果,以便让下拉列表更改价格。我假设我需要以某种方式在价格中添加一个 id,但我不确定我会怎么做。我也想用 PDO 来做这一切,但接下来我会试着弄清楚,现在我只想能够改变价格。这是我现在正在使用的代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link   href="css/bootstrap.min.css" rel="stylesheet">
    <script src="js/bootstrap.min.js"></script>
<style>
.dropbtn {
  background-color: #3498DB;
  color: white;
  padding: 16px;
  font-size: 16px;
  border: none;
  cursor: pointer;
}

.dropbtn:hover, .dropbtn:focus {
  background-color: #2980B9;
}

.dropdown {
  position: relative;
  display: inline-block;
}

.dropdown-content {
  display: none;
  position: absolute;
  background-color: #f1f1f1;
  min-width: 160px;
  overflow: auto;
  box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
  z-index: 1;
}

.dropdown-content a {
  color: black;
  padding: 12px 16px;
  text-decoration: none;
  display: block;
}

.dropdown a:hover {background-color: #ddd;}

.show {display: block;}
</style>
    <title>AJAX Search Example</title>
    <script>
    function fetch() {
      // (A) GET SEARCH TERM
      var data = new FormData();
      data.append('search', document.getElementById("search").value);
      data.append('ajax', 1);

      // (B) AJAX SEARCH REQUEST
      var xhr = new XMLHttpRequest();
      xhr.open('POST', "2-search.php");
      xhr.onload = function () {
        var results = JSON.parse(this.response),
            wrapper = document.getElementById("results");
        if (results.length > 0) {
          wrapper.innerHTML = "";
          for (let res of results) {
            let line = document.createElement("div");
            line.innerHTML = `Category:${res['category']} - OEM #:${res['oemnumber']} - Price:$${res['price']}`;
            wrapper.appendChild(line);
          }
        } else { wrapper.innerHTML = "No results found"; }
      };
      xhr.send(data);
      return false;
    }
    </script>
  </head>
  <body>
    <!-- (A) SEARCH FORM -->
    <form onsubmit="return fetch();">
      <h1>SEARCH FOR CATALYTIC CONVERTER</h1>
      <input type="text" id="search" required/>
      <input type="submit" value="Search"/>
    </form>

    <!-- (B) SEARCH RESULTS -->
    <div id="results"></div>
</br>
</br>
<div class="dropdown">
  <button onclick="myFunction()" class="dropbtn">Dropdown</button>
  <div id="myDropdown" class="dropdown-content">
    <a href="#70">%70</a>
    <a href="#60">%60</a>
    <a href="#50">%50</a>
  </div>
</div>

<script>
/* When the user clicks on the button, 
toggle between hiding and showing the dropdown content */
function myFunction() {
  document.getElementById("myDropdown").classList.toggle("show");
}

// Close the dropdown if the user clicks outside of it
window.onclick = function(event) {
  if (!event.target.matches('.dropbtn')) {
    var dropdowns = document.getElementsByClassName("dropdown-content");
    var i;
    for (i = 0; i < dropdowns.length; i++) {
      var openDropdown = dropdowns[i];
      if (openDropdown.classList.contains('show')) {
        openDropdown.classList.remove('show');
      }
    }
  }
}
</script>


  </body>
</html>

所以现在所有数据都只是作为“结果”给出,我在“line.innerHTML = Category:${res['category']} - OEM #:${res['oemnumber']} - Price:$${res['price']};”中添加了一点分隔符至少标记数据,但我希望能够将下拉列表中的 javascript 直接指向“价格”数据。对此的任何帮助将不胜感激。 这是获取数据以备不时之需的 php 脚本:

<?php
// (A) DATABASE CONFIG - CHANGE TO YOUR OWN!
define('DB_HOST', '');
define('DB_NAME', '');
define('DB_CHARSET', 'utf8');
define('DB_USER', '');
define('DB_PASSWORD', '');

// (B) CONNECT TO DATABASE
try {
  $pdo = new PDO(
    "mysql:host=".DB_HOST.";charset=".DB_CHARSET.";dbname=".DB_NAME,
    DB_USER, DB_PASSWORD, [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]
  );
} catch (Exception $ex) { exit($ex->getMessage()); }

// (C) SEARCH
$stmt = $pdo->prepare("SELECT * FROM `converter_prices` WHERE `category` LIKE ? OR `oemnumber` LIKE ? OR `price`  LIKE ?");
$stmt->execute(["%".$_POST['search']."%", "%".$_POST['search']."%", "%".$_POST['search']."%"]);
$results = $stmt->fetchAll();
if (isset($_POST['ajax'])) { echo json_encode($results); }

编辑:这是我得到的结果:

我想拥有它,所以如果我点击下拉菜单上的 70%,它会将价格列更改为价值的 70%。

就像我说的,所有的结果似乎只是进入一个“结果”变量,我正在尝试将其更改为类似于此代码的内容:

<table>
<?php
    $sql=$db->prepare('SELECT * FROM `converter_prices` WHERE `category` LIKE ? OR `oemnumber` LIKE ? OR `price`  LIKE ?);
    $sql->execute(array(':category'=>$_REQUEST[searchcategory]));

    while ($row=$sql->fetch())
    {
       echo "<tr><td>$row[category]</td><td>$row[oemnumber]</td><td>$row[price]</td></tr>";
    }
?>
</table>
但我已经用谷歌搜索了好几天,只是找不到正确的信息。我将谷歌 DOM 导航,看看是否有帮助,谢谢。

【问题讨论】:

  • 能否请您从您获得的预期 json 结果中粘贴一些项目。既然您希望在客户端更改和编辑价格,那么按照 pdo 的说法是没有意义的,如果这就是我理解的正确你想要的吗?
  • 您不需要在价格上使用 id。 DOM 导航就足够了。您可能需要添加一些 DOM 元素以帮助更轻松地查找价格。
  • 另外不要粘贴整个无聊的代码,您的示例中的 CSS 是什么?请阅读how to create a minimal, reproducible example

标签: javascript php html sql


【解决方案1】:

这是我的极简主义要点。

  • 您正在以何种传输格式获取数据数组,它是 Js 的某种可更改项目。
  • 话虽如此,有子迭代将包含某种形式的价格标签。我们想根据价格百分比乘法来更改标签。

在下面假设数据是您获取的结果。然后我们在链接上创建了一个事件列表器,只需在给定点击时运行该函数。 eventlistner 正在捕获 event.target.innerText 我们只是运行简单的正则表达式来仅从字符串中获取数字并运行乘法。

据我了解,你会怎么做。

当然,这不是最好的完美,但这就是我将如何去做。老实说,它更多的是创造力而不是技术性。

const data = [["apple","2.30"],["apple","4.5"]];
  
  
    
    links = document.querySelectorAll('a');
for (i = 0; i <  links.length; i++) {
 links[i].addEventListener("click", function() {
percentage = event.target.innerText.match(/\d+/)[0]/100;
datanew =[];

for (i = 0; i < data.length; i++) {
datanew.push(data[i][0]);
datanew.push((data[i][1]*percentage).toFixed(2));

}
console.log(datanew)



});
}
<div class="dropdown">
  <div id="myDropdown" class="dropdown-content">
    <a href="#70">%70</a>
    <a href="#60">%60</a>
    <a href="#50">%50</a>
  </div>

更新的 ID 示例

//this dummy data
const data = [["apple","2.30"],["orange","4.5"]];
  
  //this where dummy data is displayed
  wrapper = document.getElementById("results");

  //loop over data to inject html
         for (i = 0; i <  data.length; i++) {
            let line = document.createElement("div");
              //it is just as simple to create id only it must start with alaphabet not number 
            line.id=`res${[i]}`;
//we created span tag to display price and this is what we will change. on that span we will create a data-price attribute which will hold orginial price and we will run claulcations using that number 
            line.innerHTML = `Category:${data[i][0]}
            -  Price:$<span data-price='${data[i][1]}'>${data[i][1]}</span>
            select discount >>   
            <a href="#70">%70</a>
    <a href="#60">%60</a>
    <a href="#50">%50</a> <a href="#50">100%</a>`; 
            wrapper.appendChild(line);
          }
      

  
  
 //get all the links and apply event listner through loop   
    links = document.querySelectorAll('a');
      

for (i = 0; i <  links.length; i++) {
 links[i].addEventListener("click", function() {
   
 //capture link value and get number to be converted to percetnage  
percentage = event.target.innerText.match(/\d+/)[0]/100;
 //capture the data-price which is within same div as anchor link
pricetarget = event.target.parentElement.querySelector('[data-price]');
 //get value of data-price
 actualprice=  pricetarget.dataset.price;
 //run math and chnage the value on display
pricetarget.innerHTML=(actualprice*percentage).toFixed(2);


});
}
<div id="results">



</div>

我在 sn-p 中添加了 cmets 来解释发生了什么。我使用了 data-set 属性,在这种情况下非常方便。示例是完全交互式的。

来自提供的片段的更新答案

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link   href="css/bootstrap.min.css" rel="stylesheet">
    <script src="js/bootstrap.min.js"></script>
    <title>AJAX Search Example</title>
    <script>
    function fetch() {
      // (A) GET SEARCH TERM
 
      var data = new FormData();
      data.append('search', document.getElementById("search").value);
      data.append('ajax', 1);

      // (B) AJAX SEARCH REQUEST
      var xhr = new XMLHttpRequest();
    
      // (CHANGE1) USING ONREADYSTATECHNAGE INSTEAD OF ONLOAD
      
    xmlhttp.onreadystatechange =  function () {
        // (CHANGE2) we will check if ajax process has completed or not it goes from 1,2,3,4 means end. 

if(this.readyState == 4){

// (CHANGE2) when ready state comes to 4 we then check what response status was it if it is 200 good else error. 

if(this.status == 200){
    // (CHANGE3) MOVED ALL YIUR CODE HEREE 

// (CHANGE4) we need to use responseText instead of response becuase JSON comes as string that is why we are parsing it to be converted into array

var results = JSON.parse(this.responseText);
    //I have added just a meassure to check what thte out put is you can remove it latter. open dev console to get the result.
    console.log(results);

wrapper = document.getElementById("results");
    if (results.length > 0) {
          wrapper.innerHTML = "";

// (CHANGE5) UPDATED data ref with results 

for (i = 0; i <  results.length; i++) {
            let line = document.createElement("div");
              //it is just as simple to create id only it must start with alaphabet not number 

line.id=`res${[i]}`;

//we created span tag to display price and this is what we will change. on that span we will create a data-price attribute which will hold orginial price and we will run claulcations using that number 

//BIG CHANGE
//BIG CHANGE

//since after parsing invidual record will be in Js object so we dont need to access them like array  results[i]['item']

//we access them with dot notation results[i].item

line.innerHTML = `Category:${results[i].category} - OEM #:${results[i].oemnumber} - Price:$<span data-price='${results[i].price}'>${results[i].price}</span>
            select discount >>   
            <a href="#70">%70</a>
    <a href="#60">%60</a>
    <a href="#50">%50</a> <a href="#50">100%</a>`; 
            wrapper.appendChild(line);
          }

 // (CHANGE6) We moved event listeners here so any newly added elements will be updated. 

 //get all the links and apply event listener through loop   
 
    var links = document.querySelectorAll('a');
      

      for ( ii = 0; ii <  links.length; ii++) {
         links[ii].addEventListener("click", function() {
         
       //capture link value and get number to be converted to percentage  
       
       var percentage = event.target.innerText.match(/\d+/)[0]/100;
 
 //capture the data-price which is within same div as anchor link
 
 var pricetarget = event.target.parentElement.querySelector('[data-price]');
 
 //get value of data-price
 
 var actualprice=  pricetarget.dataset.price;
 
 //run math and chnage the value on display
 
 pricetarget.innerHTML=(actualprice*percentage).toFixed(2);
      
      
      });
      }

        } else { wrapper.innerHTML = "No results found"; }

 } else {
 
 //if reponse code is other ethan 200 

alert('INTERNET  DEAD OR AJAX FAILED ');

 }

 }
       

            

      };

// (CHANGE7) We moved open event to end so everything is ready before it fires.

xhr.open('POST', "2-search.php");
      xhr.send(data);
      return false;

 
    };
    </script>
  </head>
  <body>
    <!-- (A) SEARCH FORM -->
    <form ID='myForm' onsubmit="return fetch();">
      <h1>SEARCH FOR CATALYTIC CONVERTER</h1>
      <input type="text" id="search" required/>
      <input type="submit" value="Search"/>
    </form>

    <!-- (B) SEARCH RESULTS -->
    <div id="results"></div>


  </body>
</html>

存在一些 AJAX 代码异常以及一些代码调整和更新引用。我已经这样做了,所以我相信它现在应该可以工作了。

【讨论】:

  • 好吧,这可能有点超出我的想象,但它指向哪里的“价格”数据?我遇到的问题是弄清楚如何让它影响价格价值。
  • 这是一个假设.....数据是您从 php 获得的某种格式,就像在原始 sn-p 的 fetch 函数中一样。然后我们通过 onclick 事件对数据结果进行操作。
  • 数据存在于全局范围内。 onclick 1) 读取技术内部链接,然后 2) 仅获取数字并转换为百分比 = grabbed_numeber/100 3) 然后它创建数据数组的副本并通过乘以价格 x 百分比来循环它并返回计算机副本数组。 4)你可以用复制的数组做任何你想做的事情,控制台日志或重新填充你喜欢的 dom
  • 每次您在链接上 lcik 时,它都会运行以从原始数组进行计算。这就是 POS 选项在给定选项的情况下的工作方式。
  • 就像我之前评论的那样,请在它输出到echo json_encode($results); 时捕获它,我们需要查看它如何返回或在客户端运行console.log 以捕获此时的响应 var results = JSON.parse (this.response),然后我们可以处理您具体需要做的事情
【解决方案2】:

这就是我所做的,但它没有返回任何结果,就像我说我是新手一样。所以我可能没有正确安装它:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link   href="css/bootstrap.min.css" rel="stylesheet">
    <script src="js/bootstrap.min.js"></script>
    <title>AJAX Search Example</title>
    <script>
    function fetch() {
      // (A) GET SEARCH TERM
      var data = new FormData();
      data.append('search', document.getElementById("search").value);
      data.append('ajax', 1);

      // (B) AJAX SEARCH REQUEST
      var xhr = new XMLHttpRequest();
      xhr.open('POST', "2-search.php");
      xhr.onload = function () {
        var results = JSON.parse(this.response),
            wrapper = document.getElementById("results");
        if (results.length > 0) {
          wrapper.innerHTML = "";
         for (i = 0; i <  data.length; i++) {
            let line = document.createElement("div");
              //it is just as simple to create id only it must start with alaphabet not number 
            line.id=`res${[i]}`;
//we created span tag to display price and this is what we will change. on that span we will create a data-price attribute which will hold orginial price and we will run claulcations using that number 
            line.innerHTML = `Category:${res['category']} - OEM #:${res['oemnumber']} - Price:$<span data-price='${data[i][1]}'>${data[i][1]}</span>
            select discount >>   
            <a href="#70">%70</a>
    <a href="#60">%60</a>
    <a href="#50">%50</a> <a href="#50">100%</a>`; 
            wrapper.appendChild(line);
          }

        } else { wrapper.innerHTML = "No results found"; }
      };
      xhr.send(data);
      return false;

 //get all the links and apply event listener through loop   
    links = document.querySelectorAll('a');
      

for (i = 0; i <  links.length; i++) {
 links[i].addEventListener("click", function() {
   
 //capture link value and get number to be converted to percentage  
percentage = event.target.innerText.match(/\d+/)[0]/100;
 //capture the data-price which is within same div as anchor link
pricetarget = event.target.parentElement.querySelector('[data-price]');
 //get value of data-price
 actualprice=  pricetarget.dataset.price;
 //run math and chnage the value on display
pricetarget.innerHTML=(actualprice*percentage).toFixed(2);


});
}
    }
    </script>
  </head>
  <body>
    <!-- (A) SEARCH FORM -->
    <form onsubmit="return fetch();">
      <h1>SEARCH FOR CATALYTIC CONVERTER</h1>
      <input type="text" id="search" required/>
      <input type="submit" value="Search"/>
    </form>

    <!-- (B) SEARCH RESULTS -->
    <div id="results"></div>


  </body>
</html>

在将“Price:$${data[i][1]}”放入其中后,似乎没有任何地方告诉它获取“${res['price']}”。

【讨论】:

  • 现在得到它会更新一点.....XHR需要调整
  • 检查我的更新答案我已更正您原始代码中的异常情况并更新了建议中的引用以使用您的代码。
  • 我上传了代码,但没有返回任何结果。这是网址:hendersonc24137748.ipage.com/searchapp/stack.php。我还没有时间看它,看看我是否能找到任何问题,但我会在一些。非常感谢您的所有帮助!
  • 需要 jquery 才能工作,所以 jquery 应该在引导之前先加载
【解决方案3】:

基本上只需要它,以便用户可以按数字查找,然后如果有多个项目,他们可以保存每个项目并将其添加到列表或发票中,然后在最后合计金额。但我需要它列出百分比变化后的更改价格,而不是原始价格。基本上看起来像这样:

【讨论】:

  • 这几乎会在 JS 对象上大量运行并将它们映射到视觉效果。
  • 搜索Js invoice maker库,根据需要采用
  • 看看这个例子invoice-generator.com/#/1采纳它
  • 发票布局并不是真正的问题,我试图弄清楚如何在行旁边有一个“保存”按钮,以保存要添加到发票的行数据以及如何让它添加更改后的价格而不是原始价格。它是按钮的一些 javascript 代码,还是与您谈到的 indexdb 或类似的东西有关?
  • 您将在单击保存按钮时捕获整个表数据,这与来自 AJAX 的表的原始数据不同。所以是的,它将是一个 JavaScript,然后将其保存到 a) Js 对象或 b) indexDB,以便事后可以检索和处理。 IndexDB 是持久化的 Js 对象不是
猜你喜欢
  • 1970-01-01
  • 2021-08-28
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 2019-09-13
  • 2022-06-22
  • 2020-12-13
相关资源
最近更新 更多