【问题标题】:How do I pull data from my MySQL database to pre populate a form on page load?如何从我的 MySQL 数据库中提取数据以在页面加载时预填充表单?
【发布时间】:2015-01-08 13:53:01
【问题描述】:

我有一个网站,用户可以在其中注册,然后使用他们的注册信息登录,这会将他们带到一个带有表单的页面,我希望能够使用他们注册时的数据预先填充表单的某些部分/已登录。

我假设由于登录功能使用会话数据,我可以找到他们的电子邮件地址并通过所述电子邮件地址识别行,然后在与该行关联的字段中提取数据。我找不到这个工作原理的例子。

一旦我能够提取数据并填充字段,目标就是拥有 2 个按钮;一个用于保存和更新数据库,以便用户可以稍后返回并完成表单,另一个按钮在所有字段填写完毕后变为活动状态,然后提交要在确认页面上打印的数据,并向数据库添加一个值表示表单已完成的字段,因此当用户重新登录时,他们将看到表单已完成并且无法再提交。

我试图通过向其中添加一个值字符串来填充其中一个字段作为测试,但我似乎无法在任何地方找到一个示例来展示它是如何工作的。这是我的表格:

<div style="float:left;  width:450px;">

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">&nbsp;</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;">SET PART #</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;">INSTALL DATE</div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">1.</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="text" id="part1" value="<?php echo $_GET['first_name'];?>"> </div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input type="text" id="part1-install-date"></div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">2.</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="text" id="part2"></div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input type="text" id="part2-install-date"></div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">3.</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="text" id="part3"></div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input type="text" id="part3-install-date"></div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">4.</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="text" id="part4"></div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input type="text" id="part4-install-date"></div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">5.</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="text" id="part5"></div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input type="text" id="part5-install-date"></div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">6.</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="text" id="part6"></div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input type="text" id="part6-install-date"></div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">7.</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="text" id="part7"></div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input type="text" id="part7-install-date"></div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">8.</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="text" id="part8"></div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input type="text" id="part8-install-date"></div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">9.</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="text" id="part9"></div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input type="text" id="part9-install-date"></div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">10.</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="text" id="part10"></div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input type="text" id="part10-install-date"></div>

  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:35px;">&nbsp;</div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:187px;"><input type="submit" name="save" value="Save"></div>
  <div style="float:left; padding-right:7px; padding-bottom:7px;  width:192px;"><input class="send" id="register" type="submit" value="Submit" disabled="disabled"></div>
</form>



</div>

更新:

我试过这个方法:

<?php

if(isset($_SESSION)){
$userEmail=$_SESSION['email'];
$userData = fetch_assoc(query("SELECT * FROM login WHERE email = '$userEmail'"));
}

$link = mysqli_connect('localhost','username','password','database'); //TODO: your connection here
function query($sql) {
 return mysqli_query($link, $sql);
}
function fetch_assoc($query) {
return mysqli_fetch_assoc($query);
}

?>

并将此值添加到表单输入之一:

value="<?= $userData['first_name'] ?>">

现在出现 2 个错误:

警告:mysqli_query() 期望参数 1 为 mysqli,此行给出 null:

return mysqli_query($link, $sql);

和另一个错误: 警告:mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,此行给出 null:

return mysqli_fetch_assoc($query);

【问题讨论】:

  • 能否请您展示您目前编写的任何 PHP 代码?我的意思是有很多方法可以做到这一点,但很高兴看到你到目前为止所做的尝试......互联网上有大量教程可以满足你的要求。
  • 我曾在标题
  • 结果如何..?什么问题?有什么错误吗?
  • 实际上什么也没发生。我尝试了另一种方法并将结果添加到帖子中。 @Crembo
  • 您是否设置了任何 MySQL 服务器?如果是这样,您是否有任何包含数据的表格?当你回答这个问题时,我会更新我的答案,我会给出一个工作代码 sn-p..

标签: javascript php mysql forms populate


【解决方案1】:

假设您已经设置了 MySQL 数据库并填充了数据,我建议您阅读有关 PHP PDO 的内容: http://php.net/manual/en/book.pdo.php

更具体地说,看看如何连接到您的数据库: http://php.net/manual/en/pdo.connections.php

在您完成连接设置后,查询您的数据库以获取信息: http://php.net/manual/en/pdo.prepared-statements.php

特别看例子#3。

获取用户的示例:

$user = <INSERT USER>;
$pass = <INSERT PASS>;
$dbh = new PDO('mysql:host=localhost;dbname=<DATABASE NAME>', $user, $pass);

$stmt = $dbh->prepare("SELECT * FROM login WHERE email = :userEmail");
$stmt->bindParam(':userEmail', $userEmail);

if ($stmt->execute()) {
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    // now you can get your user details, for example, $user['username'] or however you have it set up in your database
}

【讨论】:

  • 我对 PDO 完全陌生,所以有些内容有点令人困惑。我以您的示例为例,将其包装在 标记中并将其放在我的 html 之前,我添加了连接没问题的用户名、密码和数据库名称。我试图在我的一个表单输入中提取“first_name”值: value="= $user['first_name'] ?>"> 并且没有任何反应。我需要将 :userEmail 更改为其他内容吗?像'MM_Username'?我的值字符串中的 $user 应该是 $userEmail 吗? @Crembo
  • 尝试添加error_reporting(E_ALL);以更好地查看错误是什么。此外, :userEmail 是您在下一行中设置的任何内容。另外,尝试将 echo $user['first_name'] 放在 $user = $stmt->fetch... 之后
  • 我尝试将 ':userEmail' 绑定到 $email,因为电子邮件字段是指示用户以及从哪一行提取数据的唯一字段。那是对的吗?我添加了错误报告,它吐出了数字 22519。我添加了: echo $user['first_name'];之后: $user = $stmt->fetch(PDO::FETCH_ASSOC);我还取出了 ASSOC)) 之后的第二个“)”,因为它给了我一个语法错误。我仍然无法获得要填充的输入值。 @Crembo
  • 我想我明白了。我切换: $stmt->bindParam(':userEmail', $userEmail);用这个: $stmt->bindParam(':userEmail', $_SESSION['MM_Username']);并能够提取数据。我认为这可以解决它。非常感谢! @Crembo
  • 是的,没错,应该可以。很高兴我能帮上忙!如果有不清楚或其他问题,请告诉我:)
【解决方案2】:

无法在 cmets 添加。

回答您的会话部分以获取数据。

在您的登录代码中:

$_SESSION['email']=$_POST['email']; //make sure not to assign any weird characters.. (SQL-INJECTION)

以及获取您的数据:

if(isset($_SESSION)){
$userEmail=$_SESSION['email'];
echo $userEmail;
//and for selecting ofc you would use the value..
}

【讨论】:

    【解决方案3】:

    首先,您需要使用一个(或多个)字段作为数据库中的主键。您提到您可以使用电子邮件字段来执行此操作,但请检查该字段是否设置为唯一。

    然后您可以捕获电子邮件的会话值并获取其余数据的数据库:

    if(isset($_SESSION)){
     $userEmail=$_SESSION['email'];
     $userData = fetch_assoc(query("SELECT * FROM your_table WHERE email = '$userEmail'"));
    }
    

    请注意,您应该根据连接数据库的方式定义fetch_assocquery方法。比如:

    global $link = mysqli_connect('localhost','username','password','database'); //TODO: your connection here
    function query($sql) {
     return mysqli_query($link, $sql);
    }
    function fetch_assoc($query) {
     return mysqli_fetch_assoc($query);
    }
    

    一旦你有了它,你就在每个输入中添加相应的值:

    <input type="text" id="part2" value="<?= $userData['lastName'] ?>"/>
    

    等等。

    另外,考虑使用类而不是在样式中重复代码。

    【讨论】:

    • 我尝试了您的方法,但在定义 fetch_assoc 和查询时一直出错。我明白了:警告:mysqli_query() 期望参数 1 为 mysqli,给定 null。
    • 首先,函数“query”甚至没有访问 $link 的权限,所以它会执行失败,因为 $link 没有在那个范围内定义。其次,将 mysqli_fetch_assoc 包装在一个只删除“mysqli”前缀的函数中有什么意义?最后,我建议使用 PDO,因为它更加严格。
    • 如何在 query() 函数中访问$link? - 在使用函数之前,您应该通过global $link; 将`$link` 包含到函数中。
    • 抱歉,我错过了全局标签,现已修复。 @Crembo 唯一的一点是让它更短,因为这个方法会被调用很多次。至于 PDO 与 Mysqli,尽管前者可能更好,但后者更容易向刚入门且还不了解对象的人学习。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2016-03-27
    • 2012-08-12
    相关资源
    最近更新 更多