2013-04-22 39 views
-2

我正在调整我在http://www.phpeasystep.com/mysql/10.html找到的一个示例,以更好地满足我的需求。这是一个结果大表,可以一次编辑而不是编辑单个记录。我修改了原文以允许传递搜索字词以将表格内容限制为特定条件。循环更新语法

我将不胜感激一些帮助找到我的错字。在最初的查询中,$ sql,我不得不改变引号一点,所以它可以与我的变量$位置。更新一些行后,我点击提交,然后只看到表头和提交按钮。没有内容,也没有更新数据库。最终更新$ sql1与第一个更新非常相似,所以我不确定它为什么不起作用。我试图弄清楚这个例子中的循环结构是否有问题。

<?php 

$host="localhost"; // Host name 
$username="*****"; // Mysql username 
$password="*****"; // Mysql password 
$db_name="Inventory"; // Database name 

// Connect to server and select databse. 
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

$location=$_POST['search']; 

echo $location; 
$sql = 'SELECT * FROM `Items` WHERE `Location` = "'.$location.'"'; 

$result=mysql_query($sql); 

// Count table rows 
$count=mysql_num_rows($result); 
?> 

<table width="500" border="0" cellspacing="1" cellpadding="0"> 
<form name="form1" method="post" action=""> 
<tr> 
<td> 
<table width="500" border="0" cellspacing="1" cellpadding="0"> 

<tr> 
<td align="center"><strong>Id</strong></td> 
<td align="center"><strong>Name</strong></td> 
<td align="center"><strong>Present Condition</strong></td> 
<td align="center"><strong>Color</strong></td> 
</tr> 

<?php 
while($rows=mysql_fetch_array($result)){ 
?> 

<tr> 
<td align="center"> 
<?php $id[]=$rows['ItemNumber']; ?> <?php echo $rows['ItemNumber']; ?> 
</td> 
<td align="center"> 
<input name="ItemName[]" type="varchar" id="ItemName" value="<?php echo $rows['ItemName']; ?>"> 
</td> 
<td align="center"> 
<select name="ItemCondition[]" id="ItemCondition"> 
    <option value="">Select...</option> 
    <option value="Excellent">Excellent !</option> 
    <option value="Good">Good</option> 
    <option value="OK">OK</option> 
    <option value="Poor">Below Average</option> 
    <option value="Change">Replace</option> 
    </select> 

</td> 
<td align="center"> 
<input name="ItemColor[]" type="varchar" id="ItemColor" value="<?php echo $rows['ItemColor']; ?>"> 

</td> 
</tr> 

<?php 
} 
?> 

<tr> 
<td colspan="4" align="center"><input type="submit" name="Submit" value="Submit"></td> 
</tr> 
</table> 
</td> 
</tr> 
</form> 
</table> 

<?php 

// Check if button name "Submit" is active, do this 
if($Submit){ 
    for($i=0;$i<$count;$i++){ 
    $sql1="UPDATE `Items` SET ItemName='$ItemName[$i]', ItemCondition='$ItemCondition[$i]', ItemColor='$ItemColor[$i]' WHERE ItemNumber='$id[$i]'"; 

    $result1=mysql_query($sql1); 
    echo $i; 
    } 
} 

if($result1){ 
header("location:inventory.php"); 
} 
mysql_close(); 
?> 

表格很简单。 ItemNumber(键),ItemName,ItemCondition,ItemColor。目前它查询项目列表,正确显示每个项目的值,但无法更新。我很难过。

百万分先谢谢。

+5

[**请不要在新代码中使用'mysql_ *'函数**](http://bit.ly/phpmsql)。他们不再被维护[并且被正式弃用](http://j.mp/XqV7Lp)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。 – Kermit 2013-04-22 21:49:07

+0

你从哪里得到'$ ItemName','$ ItemCondition'和'$ ItemColor'数组?除了最终更新查询之外,我无法在任何地方看到它们? – 2013-04-22 22:05:25

回答

0

我注意到你的代码有几个问题,并为你重写了一些代码。希望评论/代码可以解释它,但随时可以提出任何问题!

这没有经过测试,所以我提前道歉任何错别字。

<?php 
$host = "127.0.0.1"; 
$username = "*****"; 
$password = "*****"; 
$db_name = "Inventory"; 

// When possible, you should use object-based SQL statements vs procedural 
$sql = new mysqli($host, $username, $password, $db_name); 

if($sql->connect_error) { 
    die($sql->connect_error); 
} 


// This should really be checked with isset() 
// It should also be sanitized to prevent SQL injections 
$location = $_POST['search']; // This field should be sanitized to prevent SQL injections 

$get_items = $sql->query(" 
    SELECT * 
     FROM `Items` 
    WHERE `Location` = '".$location."' 
"); 

// count 
$count = $get_items->num_rows; 

// NOTE: Notice that the Submit logic comes before some of the other logic 
// This is because of the header() statement. You can't change location if you've already outputted code 
// One method around this is to buffer, but in this case, it's easier to just shift the code 
if(isset($_POST['Submit'])) { 
    for($i = 0; $i < $count; $i++) { 
     $sql->query(" 
      UPDATE `Items` 
       SET `ItemName`  = '".$_POST['ItemName'][$i]."', 
        `ItemCondition` = '".$_POST['ItemCondition'][$i]."', 
        `ItemColor`  = '".$_POST['ItemColor'][$i]."' 
      WHERE `ItemNumber` = '".$_POST['id'][$i]."' 
     "); 
    } 

    $sql->close(); // Close the connection on page-leave 
    header("Location: inventory.php"); // Remember: You can't use this method to redirect if you've already displayed any content 
    exit; 
} 
?> 
<form name="form1" method="post"> 
    <table width="500" border="0" cellspacing="1" cellpadding="0"> 
     <thead> 
      <tr> 
       <th>ID</th> 
       <th>Name</th> 
       <th>Present Condition</th> 
       <th>Color</th> 
      </tr> 
     </thead> 
     <tbody> 
     <?php 
     while($row = $get_items->fetch_assoc()) { 
     ?> 
     <tr> 
      <td align="center"> 
       <?php echo $row['ItemNumber']; ?> 
       <input type="hidden" name="id[]" value="<?php echo $row['ItemNumber']; ?>"> 
      </td> 
      <td align="center"> 
       <input name="ItemName[]" type="text" class="ItemName" value="<?php echo $row['ItemName']; ?>"> 
       <!-- This input type was "varchar" which isn't valid HTML --> 
       <!-- Also, keep in mind that an ID should only be used once. Classes can be used multiple times, however. --> 
      </td> 
      <td align="center"> 
       <select name="ItemCondition[]" id="ItemCondition"> 
        <option value="">Select...</option> 
        <option value="Excellent">Excellent !</option> 
        <option value="Good">Good</option> 
        <option value="OK">OK</option> 
        <option value="Poor">Below Average</option> 
        <option value="Change">Replace</option> 
       </select> 
      </td> 
      <td align="center"> 
       <input name="ItemColor[]" type="text" class="ItemColor" value="<?php echo $row['ItemColor']; ?>"> 
      </td> 
     </tr> 
     <?php 
     } 
     ?> 
     <tr> 
      <td colspan="4" align="center"> 
       <input type="submit" name="Submit" value="Submit"> 
      </td> 
     </tr> 
     </tbody> 
    </table> 
</form> 
<?php 
$sql->close(); // Close the connection when done executing queries 
?> 
+0

另请注意,您可以通过编写像'...'' – Uze 2013-04-22 22:32:45

+0

我想了解更多关于您的评论的信息“如果可能,您应该使用基于对象的SQL语句与过程式”,您能否提供有关任一方法的优点/缺点的参考,或者是否只是个人喜好? – 2013-04-22 22:34:44

+0

谢谢:明天当我在办公室时,我正在检查这个。我想我没有足够的安全问题经验,但幸运的是,这是完全内部的,而不是面向互联网。我找到了一个例子,并尽我所能修改它以供我使用。从我链接的例子来看,布局和逻辑是直接的。我现在看到你的解释背后的逻辑和原因。谢谢 – kkjensen 2013-04-23 02:29:15