JavaScript 中的 MySQL 查询

Posted

技术标签:

【中文标题】JavaScript 中的 MySQL 查询【英文标题】:MySQL Query Within JavaScript 【发布时间】:2013-03-14 08:47:52 【问题描述】:

我正在制作一个表单,使用 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>";

 ?>

谢谢,如果我能更好地清理这个,请告诉我。

【问题讨论】:

您可能希望将您的entry 1 部分包装在&lt;div&gt; 中,以便它与插入行的标记相匹配。或者可能将id 放在按钮上并使用insertBeforeinsertAfter 在您的dynamicInput 上会导致将新按钮添加到顶部而不是底部) 是的,我的 javascript 添加行没有插入到数据库中。当您说将我的条目 1 部分包装在一个 div 中时,它还没有吗?你能澄清一下吗? 是的,但是您将newdiv 插入到您的第一个而不是之后。你目前拥有的&lt;form&gt;&lt;div1&gt;entry1&lt;br&gt;&lt;select&gt;&lt;div2&gt;....&lt;/div2&gt;&lt;div1&gt;&lt;/form&gt; 我认为你想要的&lt;form&gt;&lt;div1&gt;entry1&lt;br&gt;&lt;select&gt;&lt;/div1&gt;&lt;div2&gt;....&lt;/div2&gt;&lt;/form&gt;。如果您的问题已得到解答,您应该接受其中之一:-) 似乎没有什么区别,只有第一行被写入数据库。我正在将我的 php 帖子添加到原始帖子中,看看是否可能存在问题。 我已经确定 javascript 没有发布到 php。但我不确定如何修复 html 表单。您已经明确表示我应该在 javascript 中添加一个 div 标记,但是我不确定要命名它以使其与 html 表单一起使用。 【参考方案1】:

很遗憾,由于 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 以及如何从服务器请求数据。

【讨论】:

尼克,它没有添加具有这些更改的行项目,按下添加按钮时没有任何反应。手动运行时,updated_list.php 正在工作。我删除了 if 以查看它是否有任何影响,但没有。谢谢。 我有一个错字。当我点击 Add 按钮时,它跳了 2。我把它改回 counter + 1。但是,它停在 #2 并且不会再继续了。仍然没有mysql数据。我将继续工作并尝试将我的原始代码与您的代码合并,看看我是否可以让它工作。感谢您的帮助。 我搞定了。我将在我的原始帖子中发布一个附录。谢谢!【参考方案2】:

这是AJAX(异步Javascript和XML)的一个经典例子——基本概念是当一个动作被执行时(例如点击一个按钮来显示内容),一些JavaScript调用一个PHP (异步),PHP 运行,返回一个 XML 文件(虽然这实际上可以是您想要的任何文件格式,现在有些人更喜欢使用 JSON,因为它更容易解析),以及此 XML/JSON 也使用 JavaScript 显示。

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

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

祝你好运:)

【讨论】:

【参考方案3】:

页面加载后,您不能在 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);

【讨论】:

以上是关于JavaScript 中的 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript(js)基础

通过 Javascript 传递 MySQL 查询

使用 javascript 函数进行 MySQL 查询。

从 javascript/AJAX 调用 MySQL 查询

Javascript 到 PHP PDO 到 MySQL 查询返回空

JavaScript 中的 HTML 助手?