我是php的新手,想要创建一个表单,用户必须在不同的行中输入数据,每行代表一个数据点。我想以这样的方式设计它,即无论何时对任何行输入数据,该特定数据点都会更新并存储在mysql服务器中,而无需等待其余条目。只要在特定单元格中输入数据,就应该发生这种情况。按返回应触发mysql服务器更新。有可能在PHP中这样做,或者我需要使用其他技术
答案 0 :(得分: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 您可以在http://jquery.com/找到有关JQuery的更多信息。 可以在此处找到JQuery API的文档:http://api.jquery.com/
答案 1 :(得分:1)
在我的回答中,我专注于你问题中的部分,你提到更新应该一次发生一个单元格,并假设你不希望提交整个表格 - 可能有不需要的假人尚未输入的单元格的数据。
使用仅 PHP无法做到这一点。 PHP在服务器上运行,代码无法对浏览器中发生的事件做出反应。您需要将PHP服务器代码与JavaScript客户端代码相结合。
由于用户应该继续进入相同的表单,指出如何提交表单的解决方案是不够的。表单提交时,页面也会重新加载。
要实现一次发送一个单元,需要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
(或您选择的其他网址)支持此代码,类似于:
$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
条款中包含哪些内容?
根据您的用例的具体情况,快速且我希望相当容易理解的方法是在HTML中使用data
属性。浏览器支持不完整,但它适用于所有现代浏览器。上面的片段更改为:
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键更新单个值,您还必须:
对于那些,您可以修改Ignacio Belhot Colistro:使用
的答案$('.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答案中的那个)可能是您最好的解决方案。
上述注意事项适用于我的所有代码段。他们都应该调整和完成。但是这个答案已经太冗长了,我相信这可能是初学者实现你要求的详细功能的最现实的方式。
我希望这可以帮助你至少开始朝着一个好的方向前进。
答案 2 :(得分:-1)
您需要使用javascript和ajax。
就个人而言,我使用了jeditable jquery插件。您可以将其设置为在ENTER上更新,或者让它需要单击按钮。输入可以是文本框或下拉菜单等。这非常酷。
http://www.appelsiini.net/projects/jeditable
示例:
http://www.appelsiini.net/projects/jeditable/default.html
我建议你现在开始处理它,并在堆栈溢出时发布有关代码的问题。您当前的问题不是真正的代码问题,而且会被低估。