php - 从数据库值填写表单字段
Posted
技术标签:
【中文标题】php - 从数据库值填写表单字段【英文标题】:php - filling in form fields from database values 【发布时间】:2012-02-05 02:33:37 【问题描述】:我正在尝试使用用户之前在数据库中输入的值“预填充”(不确定是否有技术术语)表单字段。对于这个例子,它是一个城市和州。当用户加载页面以编辑选项时,这些值(他们之前输入的)将自动出现在文本框中。
<tr><td>City</td><td><input type="text" name="city" value="<? $city = "usercity"; echo $formValue->location('$city'); ?>"></td>
<td>State</td><td><input type="text" name="state" value="<? $state = "userstate"; echo $formValue->location('$state'); ?>"></td>
有没有什么方法可以根据输入(从上面的框中)设置一个值?如果是 function location($input)
之类的,我会知道怎么做,但是当括号中没有任何内容时,有什么方法可以设置值吗?
function location()
$userid = $_SESSION['userid'];
$server = 'localhost';
$user = 'root';
$password = '';
$connection = mysql_connect($server, $user, $password) or die(mysql_error());
mysql_select_db(testdb, $connection) or die(mysql_error());
$result = mysql_query("SELECT '$location' FROM userinfo WHERE userid = '$userid'");
$user_data = mysql_fetch_array($result);
if($location =='usercity')
$userlocation = $user_data['usercity'];
return $userlocation;
else
$userlocation = $user_data['userstate'];
return $userlocation;
【问题讨论】:
$city = "usercity"; echo $formValue->location('$city'); usercity 是数据库中列的名称。如果我只是输入 $formValue->location('usercity') 那么我应该如何在函数中使用该输入? 您当前的设置有什么问题?你有错误吗?您也可以返回 $user_data 数组,现在您正在向数据库发送不必要的查询。 对不起,我不确定我是否清楚地理解了您的问题(我在下面的回答中看到了您的代码中的错误)。您是否需要更好的方法来实现这一点,或者您是否遇到错误? (如果您使用的是您向我们展示的代码,它将不起作用 - 请参阅我的答案)。 有没有办法根据我上面描述的方式设置输入? (我是从原版编辑的,所以这与我原来的问题不同) 【参考方案1】:不要从全局角度考虑这个问题,而是要考虑问题所在的背景。
您的出发点(从服务器的角度来看)是来自该页面的客户端的 HTTP GET 请求,或者客户端在 POST 请求之后返回该页面。在任何一种情况下,服务器都已找到应处理此请求的“资源”(php 脚本),并通过使用脚本文件加载 PHP 解释器来分派它。
此时的上下文在脚本的第一行;在解释器刚刚完成解析并开始执行的地方。问问自己:当前请求是否包含活动会话标识符?如果它确实有一个活动会话,则检查客户之前是否填写过此表单,如果有,则将他们之前提交的默认表单值替换为正常表单默认值。如果客户端没有活动会话或之前未使用过表单,则根据需要显示带有默认值的空白表单。
提示:考虑使用这种技术来调试您的代码。在代码中选择一行并在该位置放置一个心理“断点”。问问自己:此时此脚本的上下文是什么?定义了哪些变量?服务器状态是什么?客户期待什么?有了这些问题的答案后,编写代码就很简单了。
【讨论】:
当我有两个不同的功能时,我可以填写这些字段;一个代表城市,一个代表州。我无法通过区分输入来弄清楚如何使用一个函数来做到这一点。 Drupal 采用回调方法:类似于hook_form_alter($form, &$state = null)
,其中$form
表示默认数据结构,$state
是表单数据结构的当前状态(来自先前的调用或空白如果是新的调用)。
我发现了部分问题,现在我有另一个问题。对于我的一个领域,我正在使用“textarea”。有什么方法可以像使用典型的文本块一样填写值吗?
在您的 html 模板中,您有 <textarea name="text-data">TEXT</textarea>
。对于典型的表单元素,该值通常位于节点属性值中,例如<input type="text" name="text-data" value="TEXT"/>
。与其将数据代入属性,不如将其代入 textarea 的节点值。在这两种情况下,请记住适当地转义输出数据以防止出现一些奇怪且可能危险的错误。【参考方案2】:
根据我在您的代码中看到的,您的变量用单引号括起来:
$city = "usercity"; echo $formValue->location('$city');
删除单引号,因为它将按原样传递 '$city',而不是 $city 的值。试试
$city = "usercity"; echo $formValue->location($city);
为了更清楚:
$city = "usercity";
print ('$city'); // will print $city
print ($city); // will print usercity
【讨论】:
【参考方案3】:我最近的几个项目到处都是表格,每次都告诉 php 填写表格是一件很痛苦的事情。
对于我当前的项目,我保持输入名称与 mysql 字段名称相同。使提交和填充变得更容易。
在填充表单时,我使用了一些 ajax(整个项目都使用了 jQuery,因此使用了 jquery 的 ajax() 函数;
表格
<form>
<input name="field_one" type = "text" >
<input name="field_two" type = "text" >
<input type="button" value="Send">
</form>
我在文档顶部放置了一个条件语句,如下所示:
<?php if($_POST['update'])
$query=mysql_query("SELECT * FROM table WHERE unique_id='$id' LIMIT 1");
echo json_encode(mysql_fetch_assoc($query));
exit;
?>
假设您有一个您希望能够单击和编辑的项目列表(用相应的数据填充表单)。我为它分配了一个data-
属性并用它的唯一ID 填充它,通常是一个AI PRIMARYKEY 例如:
while($r=mysql_fetch_assoc($data))
echo "<li data-unique_id=\"\">$r[name]<span class="edit">edit</span></li>";
?>
$('.edit').click(function()
var toget = $(this).parent().data('unique_id');
$.ajax(
url:'here so it sends to itself',
data:'update='+toget,
success:function(data)
for (var key in data)
if (data.hasOwnProperty(key))
$('input[name="'+key+'"]').each(function()
$(this).val(data[key]);
);
);
<select>, <textarea>, checkboxes
需要做更多的工作,但同样的一般想法也适用,(我加入了几个 if 语句,但它可能会处理得更好)
我可能会更好地解释这一点,但我希望你明白这个想法,我已经提供了一些帮助。
仅供参考
我的插入就像...
foreach($_POST as $k=>$v)
$v=mysql_real_escape_string($v);
$fields.=" `$k`,";
$vals.=" '$v',";
$fields=substr($fields,0,strlen($fields)-1);//to get rid of the comma :)
$vals=substr($vals,0,strlen($vals)-1);//and again
mysql_query("INSERT INTO ($fields) VALUES ($vals)");
【讨论】:
我不会否决这个答案,但我认为它的例子是矫枉过正的。它也不会逃避输出,因此它可能容易受到 XSS 攻击。 我会为你扔一个stripslashes :) @Joshua 除此之外,您能看出这不是一个好主意的任何原因吗?只是想知道这样继续下去是否安全,(对不起,伙计,不是想劫持你的问题) 除了stripslashes
(或mysql_real_escape_string
)没有以任何与此相关的任何形式或形式正确使用,除了数据库插入易受SQL注入攻击之外,除此之外都没有解决输出端的 XSS 攻击向量?是的,这是一个非常非常糟糕的解决方案,现在有多种不同的方式。以上是关于php - 从数据库值填写表单字段的主要内容,如果未能解决你的问题,请参考以下文章
将数据从 html 页面插入到 php 表单中,就像自动填充值一样