-1

我是 php 新手,想创建一个表单,用户必须在不同的行中输入数据,每行代表一个数据点。我想以这样一种方式设计它,即每当针对任何行输入数据时,该特定数据点都会更新并存储在 mysql 服务器中,而无需等待其余条目。一旦在特定单元格中输入数据,它就会发生。按下返回应该会触发 mysql 服务器中的更新。是否可以在 php 中这样做或者我需要使用其他一些技术

4

3 回答 3

2

据我所知,PHP 是一种服务器端语言,它不提供与客户端的交互,因为它只是在服务器上运行。对于这样的事情,您应该使用 Javascript/JQuery 并在按下返回键后触发一个事件,例如:

$(document).keydown(function (e) {
        var keyCode = e.keyCode || e.which,
        key = {enter: 13}; //You can add more key definitions here
        switch (keyCode) {
            case key.enter: { //key.enter refers to 13
                alert('Enter was pressed');
                //Inside here you can do your post calls to PHP but I'm not very sure on what you want to accomplish once the key is pressed down.
            }
        }
});

这是一个与您类似的问题:Detect Enter key is pressed with jquery 您可以在以下位置找到有关 JQuery 的更多信息:http: //jquery.com/ JQuery API 的文档可以在此处找到:http: //api.jquery.com /

于 2013-08-26T06:38:14.757 回答
1

在我的回答中,我专注于您的问题中您提到更新应该一次发生一个单元格的部分,并假设您不希望提交整个表单 - 可能包含不需要的虚拟数据尚未进入的单元格。

你不能使用PHP 来做到这一点。PHP 在服务器上运行,代码无法对浏览器中发生的事件做出反应。您需要将 PHP 服务器代码与 JavaScript 客户端代码结合起来。

由于用户应该继续输入相同的表单,因此指出如何提交表单的解决方案是不够的。当表单提交时,页面也会重新加载。

要实现一次发送一个cell,需要Ajax。如果要支持旧版本的特别是 Internet Explorer,那么跨浏览器使用 Ajax 可能会有点复杂。因此,我建议您将 jQuery 用于您的 Ajax 请求。jQuery 为您处理跨浏览器问题。

jQuery 还可以帮助您从表单字段中获取数据。如果您让您的 PHP 代码输出类似于以下内容的 HTML:

<input type="text" class="datapoint" name="datapoint1" value="default value" />
<input type="text" class="datapoint" name="datapoint2" value="default value" />
... 

那么你在 jQuery 中学习的目标是如何编写类似于:

$(document.ready(function() {  // This is a way to have jQuery bind the desired actions when the page is built in the browser. 
    $('.datapoint')  // Finds all elements in the document with class="datapoint"
    .on("change", function () {  // Binds an action to execute when the value is changed - detected when the input loose focus, i.e. when the user moves to the next cell
         var params = { name: $(this).attr('name'), value: $(this).attr('value') };  // Extracts name and value from the input field changed
         $.ajax({
             url: updatevalue.php, 
             data: params
         });
    }); 
}); // Ends the $(document.ready(function() {

在服务器上,您需要使用updatevalue.php(或您选择的其他 URL)支持此代码,类似于:

$name = $_REQUEST['name']; 
$value = $_REQUEST['value']; 

switch ($name) {
    case 'something': 
        // Prepare PDO statement
        break; 
    case 'something else': 
        // Prepare some other PDO statement
        break; 

    ... 
}

... execute PDO ... 

对于 PHP 的初学者,我建议学习使用 PDO 进行数据库访问。请确保在 PDO 中使用准备好的语句,有关如何执行此操作,请参阅 PHP 手册。

另外,请记住不要使用该name值来构建类似于以下的动态 SQL 表达式:

$query = 'UPDATE myTable SET '.$name.'=:value'; // Very bad idea!

因为这会在您的应用程序中引入一个巨大的安全漏洞。

仍然缺少一些东西。在你的WHERE条款中加入什么?

根据您的用例的具体情况,一种快速且我希望相当容易理解的方法是使用dataHTML 中的属性。浏览器支持并不完整,但它适用于所有现代浏览器。上面的片段更改为:

var params = { name: $(this).attr('name'), value: $(this).attr('value'), recordid: $(this).data('recordid') };
...
<input type="text" class="datapoint" name="datapoint1" data-recordid='1234' value="default value" />

到目前为止的答案并没有回答您的问题,因为这不会让您的用户按 Enter 键来更新单元格。它确实让用户通过输入字段进行选项卡,并且当用户离开该字段时数据库将被更新。

要让用户按 Enter 键更新单个值,您还必须:

  1. 确保按 Enter 不会提交完整的表单。
  2. 确保按 Enter 会触发输入上的更改事件。

对于那些,您可以修改 Ignacio Belhot Colistro:s answer to use

$('.datapoint').keydown(function (e) {

而不是$(document). ...

e.preventDefault(); 
$(this).blur(); // As if the user tabbed or clicked to focus on some other element

而不是alert.

警告:这是一种简单的编码方式。但是,为页面中的许多元素构造新函数并将其附加到 keydown 事件是非常低效的。如果您有很多字段,那么这种方法可能会给您带来性能问题。在这种情况下,使用一些现成的插件(如 Buttle Butkus 答案中的那个)可能是您最好的解决方案。

上面的警告对我所有的片段都有效。它们都应该被调整和完成。但是这个答案已经太长了,我相信这可能是初学者实现您所要求的详细功能的最现实的方式。

我希望这可以帮助您至少朝着一个好的方向开始。

于 2013-08-26T08:30:36.020 回答
-1

您需要使用 javascript 和 ajax。

就个人而言,我使用 jeditable jquery 插件。您可以将其设置为在 ENTER 上更新,或者让它需要单击按钮。输入可以是文本框,也可以是下拉菜单等,很酷。

http://www.appelsiini.net/projects/jeditable

例子:

http://www.appelsiini.net/projects/jeditable/default.html

我建议你现在就开始研究它,并在堆栈溢出时发布关于代码的问题。您当前的问题并不是真正的代码问题,并且会被否决。

于 2013-08-26T06:25:50.070 回答