2011-06-01 31 views
0

我有一个问题,我是PHP新手,我一直在做一些练习。我目前的工作是创建一个简单的表单来搜索数据库(名字,姓氏)。返回的结果应该填充到另一个表单中。这样,如果我想更新记录,我所要做的就是更改填充表单的值并点击更新。我创建数据库没有问题。PHP,关于搜索和更新记录的问题

以下是代码。 (大家不要笑,我很新...我相信有这样做的更有效的方式,但我只是玩弄现在)

这里是形式:

<form action="" method="post"> 
<strong>Search for name</strong><br> 
<label for="fname">First Name</label> 
<input type="text" name="fname"> 

<label for="lname">Last Name</label> 
<input type="text" name="lname"> 

<input type="submit" name="submit" value="Search"> 

</form> 

这里是PHP:

if(isset($_POST['submit'])){ 

    $first_name = $_POST['fname']; 
    $last_name = $_POST['lname']; 

    if ($first_name == NULL || $last_name == NULL) { 
     echo "please enter search record"; 
    } 
    else { 
     $query = "SELECT first_name, last_name FROM formdata WHERE first_name LIKE '%$first_name%' OR last_name LIKE '%$last_name%'"; 

     $result = mysqli_query($conn, $query); 

     $result_array = mysqli_fetch_row($result); 

     $fname_value = $result_array[0]; 
     $lname_value = $result_array[1]; 

     echo " 
     <form action='' method='post'>\n 
      <label for='fname_u'>First Name</label>\n 
      <input type='text' name='fname_u' value='$fname_value'>\n 

      <label for='lname_u'>Last Name</label>\n 
      <input type='text' name='lname_u' value='$lname_value'>\n 

      <input type='submit' name='update' value='Update'>\n 
     </form>"; 

    } 

} 


if(isset($_POST['update'])) { 

    $first_name_u = ($_POST['fname_u']); 
    $last_name_u = ($_POST['lname_u']); 

    $query_update = "UPDATE formdata SET first_name = '$first_name_u', last_name = '$last_name_u' WHERE first_name = '$fname_value';"; 

    echo $query_update; // this is just for testing 

} 

此代码似乎工作,做我想做的,一路攀升时,我提交更新的信息。我无法弄清楚如何将$ fname_value变量的值传递给if(isset($ _POST ['update']))条件。我想我不能,因为他们是两个不同的POSTS?我真的不知道......我只需要找到一种方法来获取检索到的表单数据的值并将其用于WHERE子句。

同样,我很新的,刚开始我的脚湿用这种东西...任何帮助将是巨大的

感谢

+0

我们都是新的一次。任何看着代码和笑的人都会傲慢到危险的地步。欢迎来到网站设计的酷炫世界,祝您学习愉快! – 2011-06-01 03:43:58

回答

1

我认为你必须在你的代码一个错字。您的POST数据保存到变量$first_name,但是当您查询SQL时,您正在使用$first_name_r而不是$first_name

+0

嘿,感谢您的快速回复......对不起,因为我正在将代码复制到此线程中,这是一个错字。我在编辑器中命名了一些不同的变量,并且在我将其粘贴到这里时忘了更改它。我更新了上面的代码,并且我确信所有名称在我的末尾都拼写正确...对于混淆 – kdub 2011-06-01 03:30:03

0

我在想错字是答案,但我必须指出你犯的一个致命错误,那就是你将用户提供的输入直接输入到SQL查询中。这会将您的代码打开到一系列称为SQL injection攻击的恶意攻击。我并不想说服自己,但它很重要,因为你阅读并理解那篇文章,尤其是关于缓解的部分。

我会建议你使用这样的事情,而不是:

$query = 'SELECT first_name, last_name '. 
    'FROM formdata WHERE first_name LIKE ? OR last_name LIKE ?;'; 
$sth = mysqli_prepare($dbh, $query); 
mysqli_stmt_bind_param($sth, "s", '%'.$first_name.'%'); 
mysqli_stmt_bind_param($sth, "s", '%'.$last_name.'%'); 
$result = mysqli_execute($sth); 

我知道这是一个有点更长,更复杂,但相信我,它会为你节省世界头痛的。你越早了解这一点,并深深根植于你的心理,你永远不会有,有史以来写一个查询,通过unsanitized输入直接到数据库,越快乐,我们都会(越久,你会得到最终保持你的工作;)。

对不起,如果我来强壮,但在我看来,你需要早日开发数据库驱动的网站的最重要的一课,是你真的需要精通发现注入漏洞到指出它是自动的,当你看到它时,你会想:“哦,不!不要那样做!!!”

+0

哦,不,请欣赏非常多的反馈....这只是一个简单的练习练习 – kdub 2011-06-01 03:59:30

+0

哦,对不起,另外,错字不是问题...我将代码复制到此线程并开始更改变量名称,我只是在提交 – kdub 2011-06-01 04:01:23

0

以上回答您发现isssue,但在旁注:

$first_name = $_POST['fname']; 
$last_name = $_POST['lname']; 

不要这样。我的朋友是PHP应用程序最常见的安全漏洞。

最2周最重要的事情要记住,当脚本是

  1. 滤波器的输入,并 2:逃离输出。

See this write-up for more details ..

在你的情况下,输入值不被过滤,或检查恶意/不当值。

这里是另一本关于this page的入门书,您将看到一些提示以及如何解决过滤问题。

保持它,这些练习是拾取排骨的好方法。

快乐编码的朋友。

+0

之前没有更改它们,非常感谢,我很感激反馈意见......就像我上面发布的那样,对于混淆,感到抱歉。我的代码中不存在拼写错误。只在这篇文章中。我将我的代码复制到帖子中,并开始更改变量名称,在提交我的问题之前,我只是没有更改它们... – kdub 2011-06-01 04:02:50

0

好的,重新阅读你的文章,我想我明白你想要做什么以及你有什么困难。通常情况下,您不会有像这样的相同表单的两个单独的页面。通常情况下,您会按照这些方式编写更多代码,请记住,我正在将其从头顶转过来,而不是实际测试它,因此可能需要进行较小的更正和/或调整:

<?php 
    $fname_value = ''; 
    $lname_value = ''; 
    if (isset($_POST['submit']) && $_POST['submit'] === 'Search') { 
    if (isset($_POST['fname']) && isset($_POST['lname'])) { 
     // We are processing a submitted form, not displaying a brand new one 
     // from scratch. Code any post-validation steps. 

     // Fetch the user information from the database. You'll need to define 
     // the $host, $user, $password, and $dbname variables above, or 
     // substitute literal strings with real information in here. 
     $dbh = new mysqli($host, $user, $password, $dbname); 
     $sql = 'SELECT first_name, last_name'. 
     'FROM formdata WHERE first_name LIKE ? OR last_name LIKE ?;'; 
     $sth = $dbh->prepare($sql); // Use parameters to avoid injection! 
     $sth->bind_param('s', $_POST['fname']); 
     $sth->bind_param('s', $_POST['lname']); 
     if ($sth->execute()) { 
     $result = $sth->get_result(); 
     if (($row = $result->fetch_assoc()) != NULL) { 
      // Set the default values displayed in the text edit fields. 
      $fname_value = $row['first_name']; 
      $lname_value = $row['last_name']; 
     } 
     } 

     // Whatever other processing you want to do if this is a submitted 
     // form instead of displaying the page from scratch. 
    } 
    } 
?> 
<html> 
    <body> 
    <form action="<?= $_SERVER['PHP_SELF'] ?>" method="POST"> 
     <strong>Search for name</strong><br /> 
     <label for="fname">First Name</label> 
     <input type="text" name="fname" value="<?= htmlentities($fname_value) ?>"> 
     <label for="lname">Last Name</label> 
     <input type="text" name="lname" value="<?= htmlentities($lname_value) ?>"> 
     <input type="submit" name="submit" value="Search"> 
    </form> 
    </body> 
</html> 
+0

嘿,非常感谢代码...我真的很感激它....让我问你...使用mysqli_connect()函数和创建mysqli类的新实例有什么区别。 – kdub 2011-06-02 00:52:54

+0

真的没有一个。使用mysqli类是面向对象的编程,其中使用mysqli_函数更具有程序性。他们都做同样的事情。它真的归结为你更喜欢哪个。就我个人而言,我更喜欢OO类,因为它可以节省一些打字量。 :) – 2011-06-02 02:27:12