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, &amp;$state = null),其中$form 表示默认数据结构,$state 是表单数据结构的当前状态(来自先前的调用或空白如果是新的调用)。 我发现了部分问题,现在我有另一个问题。对于我的一个领域,我正在使用“textarea”。有什么方法可以像使用典型的文本块一样填写值吗? 在您的 html 模板中,您有 &lt;textarea name="text-data"&gt;TEXT&lt;/textarea&gt;。对于典型的表单元素,该值通常位于节点属性值中,例如&lt;input type="text" name="text-data" value="TEXT"/&gt;。与其将数据代入属性,不如将其代入 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]);
            );
        
        
        
    );

&lt;select&gt;, &lt;textarea&gt;, 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 表单中,就像自动填充值一样

PHP:预先填写 PDF 文件的字段并将其保存为默认值

在下拉选择中,如何从数据库中填写完整的表单字段

从一个表单字段获取条目并在数据库中搜索其对应数据并自动填写表单中的其他字段

如何根据唯一值和另一个表单中的值自动填写表单中的字段

用户通过PHP填写表单后如何自动生成页面?