MySQL Query Within JavaScript

MySQL Query Within JavaScript

本文关键字:JavaScript Within Query MySQL      更新时间:2023-09-26

我正在编写一个表单,其中使用JavaScript来添加另一个行项。目的是将行项目添加到发票中。当在我的表单中使用文本框时,我已经成功地使其工作正常,但我卡住了如何使其与下拉框一起工作,该下拉框调用mysql以获取下拉框数据。

这是我的。

 <?php
     include $_SERVER['DOCUMENT_ROOT']."/connect.php";
     include $_SERVER['DOCUMENT_ROOT']."/includes/header.php";
 ?>
 <script type="text/javascript">
     var counter = 1;
     function addInput(divName){
          var newdiv = document.createElement('div');
          newdiv.innerHTML = "Entry " + (counter + 1) + " <br><select name='myInputs[]'><?php $result = mysql_query("SELECT * FROM salesitem"); while($row = mysql_fetch_array($result)) { echo "<option value='"".$row['name']."'">".$row['name']."</option>";} ?></select>";
          document.getElementById(divName).appendChild(newdiv);
     }
 </script>
 <form method="POST">
     <div id="dynamicInput">
          Entry 1<br><select name="myInputs[]"><?php $result = mysql_query("SELECT * FROM salesitem"); while($row = mysql_fetch_array($result)) { echo "<option value='"".$row['name']."'">".$row['name']."</option>";} ?></select>
     </div>
     <input type="button" value="Add another text input" onClick="addInput('dynamicInput');">
 </form>

这里有一些关于正在发生的事情的信息。现在,上面的JavaScript代码显示了其中的MySQL查询。这就破坏了添加行项的功能。如果我只是删除查询,但留下另一个php,添加行项又开始工作,但当然下拉列表中没有数据。

在表单本身中,它从数据库中获取第一行项,而不使用javascript,这是正常工作的。

我觉得我离目标越来越近了,但不知道下一步该怎么走。

提前感谢。

编辑:多亏了尼克,我才成功了。代码如下:

 <?php
 include $_SERVER['DOCUMENT_ROOT']."/connect.php";
 include $_SERVER['DOCUMENT_ROOT']."/includes/header.php";
 ?>
 <script type="text/javascript">
 var counter = 1;
 function addInput(div){
    xmlhttp=new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
      var newdiv = document.createElement('div');
      newdiv.innerHTML = "Entry " + (++counter) + " <br><select name='myInputs[]'>" + xmlhttp.responseText + "</select>";
     }
      document.getElementById(div).appendChild(newdiv);
   }
 xmlhttp.open("GET", "update_text.php", false);
 xmlhttp.send();
 }
 </script>
 <form method="POST">
 <div id="dynamicInput">
      Entry 1<br><select name="myInputs[]"><?php $result = mysql_query("SELECT * FROM salesitem"); while($row = mysql_fetch_array($result)) { echo "<option value='"".$row['name']."'">".$row['name']."</option>";} ?></select>
 </div>
 <input type="button" value="Add" onClick="addInput('dynamicInput');">
 </form>

update_text.php

 <?php
 include $_SERVER['DOCUMENT_ROOT']."/connect.php";
 $result = mysql_query("SELECT * FROM salesitem");
 while($row = mysql_fetch_array($result)) {
 echo "<option value='"".$row['name']."'">".$row['name']."</option>";
 }
 ?>

这里是我的php帖子进入数据库,这是不工作的javascript添加行项目,只有从表单创建的原始条目。(除了下拉菜单,我还有其他字段)。

 <?php
 include $_SERVER['DOCUMENT_ROOT']."/connect.php";
 $company = mysql_real_escape_string($_POST['company']);
 foreach($_POST['item'] as $i => $item)
 {
   $item = mysql_real_escape_string($item);
 $quantity = mysql_real_escape_string($_POST['quantity'][$i]);
 mysql_query("INSERT INTO invoice (company, item, quantity) VALUES ('$company', '".$item."', '".$quantity."') ") or die(mysql_error());
 }
 echo "<br><font color='"green'"><b>Invoice added</b></font>";
 ?>

谢谢,如果我能把它整理得更好,请告诉我。

遗憾的是,由于PHP的特性,您尝试这样做的方式不起作用。

当一个客户端从服务器请求你的页面时,所有的php都被执行。

javascript函数中的php块实际上只是php的静态结果。

您需要使用XMLHttpRequests/Ajax从服务器请求新数据。

这里有一个快速(可能相当糟糕)的例子!

修改你的javascript函数:

var counter = 1;
function addInput(div) {
    xmlhttp=new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                    var d = document.getElementById(div);
                    d.innerHTML=d.innerHTML  +"<div>Entry " + (++counter) + " <br><select name='myInputs[]'>" + xmlhttp.responseText + "</select></div>";
        }
    }
    xmlhttp.open("GET", "updated_list.php", false);
    xmlhttp.send();
}

服务器上的新php文件:(updated_list.php)

<?php 
// you'll need to include stuff to connect to your database here
$result = mysql_query("SELECT * FROM salesitem"); 
while($row = mysql_fetch_array($result)) { 
    echo "<option value='"".$row['name']."'">".$row['name']."</option>";
} 
?>

我确实说过这是一个不好的例子:)我原来的代码覆盖了你的div的内容,而不是添加到它,我更新了。这只是一个示例,您应该仔细阅读AJAX以及如何从服务器请求数据。

加载页面后,不能在javascript函数中使用服务器代码。服务器端代码就像它的名字一样——在服务器上运行的代码。因此,在页面完成加载后,它"返回"到客户端,现在只有客户端代码(javascript)可以运行。所以你的行

newdiv.innerHTML = "Entry " + (counter + 1) + " <br><select name='myInputs[]'><?php $result = mysql_query("SELECT * FROM salesitem"); while($row = mysql_fetch_array($result)) { echo "<option value='"".$row['name']."'">".$row['name']."</option>";} ?></select>";

是一个小错误

你可以做的是将数据从数据库返回到javascript(使用json将是最好的选择),然后使用来自服务器的原始数据动态地构建选择框,现在是javascript数据。

假设你的数据是

var data = [{name:'n1'},{name:'n2'},{name:'n3'}];

您可以使用javascript运行这些数据并构建您的组合:

var newSelect = document.createElement('select');
for(var i=0;i<data.length;i++){
  var name = data[i].name;
  newSelect.options[newSelect.options.length] = new Option(name,name);
}

这是一个经典的例子为 AJAX(异步Javascript和XML)的基本概念是,当一个动作执行(例如,单击一个按钮显示内容),一些Javascript调用PHP(异步), PHP运行时,返回一个XML文件(尽管这可以是任何你想要的文件格式,现在一些人更喜欢使用JSON,因为它是更容易解析),和这个XML/JSON的内容显示出来,也使用Javascript。

虽然上面的例子是显示内容,但没有理由认为任何需要在服务器上运行的操作(例如向数据库插入数据)也不能异步完成。

SO不是一个为人们编写代码的地方——所以现在我给了你一个提示,从哪里开始,作为对读者(/问题提问者!)的练习,看看一些AJAX教程,确保你理解了这个概念,写一些代码,如果仍然不能让它工作,再回来!

祝你好运