2017-07-25 59 views
0

我有一个数据库,其中包含一些显示在网页上的数据行。现在,我正在寻找一种方法将mysql中的每个“ID”字段链接到一个按钮,以便单击该按钮时,将运行一个php脚本,该脚本将删除与该ID关联的一行mysql信息。如何将mysql'id'链接到html元素

我知道这是不正确的,但我认为它接近。只是不知道id标签中的php部分。帮帮我?

<form action="remove.php" method="post"> 
    <input type="submit" value="Remove Entry" id="<?php $row['id'] ?>" /> 
</form> 

我是否在正确的道路上? 会remove.php看起来像...

<?php 

$conn = mysqli_connect($servername, $username, $password, $dbname); 
// Check connection 
if($conn === false){ 
    die("ERROR: Could not connect. " . mysqli_connect_error()); 
} 

$sql = "DELETE from newcars (stock, year, make, model, trim) 
     WHERE ('$_POST[id] = $row[id]'); 

if(mysqli_query($conn, $sql)){ 
    echo "Records deleted successfully."; 
} 

else { 
    echo "ERROR: Could not execute $sql. " . mysqli_error($link); 
} 

mysql_close($conn) 
?> 

任何帮助将不胜感激。 谢谢!

+4

噢,为什么你在其他地方使用'mysql_close'而不是'mysqli_ *'? **请**,不要使用'mysql_ *'函数来获取新代码。他们不再被维护,社区已经开始[弃用过程](http://news.php.net/php.internals/53799),并且'mysql_ *'函数已经在PHP 7中被正式删除。相反,你应该了解[已准备好的语句](https://en.wikipedia.org/wiki/Prepared_statement)并使用“PDO”或“mysqli_ *”。如果你不能决定,[这篇文章将有助于选择你最好的选择](http://php.net/manual/en/mysqlinfo.api.choosing.php)。 – GrumpyCrouton

+3

这是你的实际代码?那里有一些错误。 – WheatBeak

+1

**警告**:使用'mysqli'时,应该使用[参数化查询](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和['bind_param']( http://php.net/manual/en/mysqli-stmt.bind-param.php)将用户数据添加到您的查询中。 **不要**使用字符串插值或连接来完成此操作,因为您创建了严重的[SQL注入漏洞](http://bobby-tables.com/)。 **不要**将'$ _POST','$ _GET'或**任何**用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 – tadman

回答

3

HTML:

<form action="remove.php" method="post"> 
    <input type="hidden" name="id" value="<?php echo (int)$row['id']; ?>"> 
    <input type="submit" value="Remove Entry" /> 
</form> 

您想通过ID表单元素,不会与提交按钮。

PHP看起来像这样 - 这是比您的原始代码更安全,因为它使用预准备语句。

<?php 

$conn = mysqli_connect($servername, $username, $password, $dbname); 
// Check connection 
if($conn === false) { 
    die("ERROR: Could not connect. " . mysqli_connect_error()); 
} 

$stmt = $conn->prepare("DELETE FROM newcars WHERE id = ?"); 
// prepare() can fail because of syntax errors, missing privileges, .... 
if(false === $stmt) { 
    // and since all the following operations need a valid/ready statement object 
    // it doesn't make sense to go on 
    // you might want to use a more sophisticated mechanism than die() 
    // but's it's only an example 
    die('prepare() failed: ' . htmlspecialchars($mysqli->error)); 
} 

$rc = $stmt->bind_param('i', $_POST['id']); 
// bind_param() can fail because the number of parameter doesn't match the placeholders in the statement 
// or there's a type conflict(?), or .... 
if(false === $rc) { 
    // again execute() is useless if you can't bind the parameters. Bail out somehow. 
    die('bind_param() failed: ' . htmlspecialchars($stmt->error)); 
} 

$rc = $stmt->execute(); 
// execute() can fail for various reasons. And may it be as stupid as someone tripping over the network cable 
// 2006 "server gone away" is always an option 
if(false === $rc) { 
    die('execute() failed: ' . htmlspecialchars($stmt->error)); 
} 

$stmt->close(); 

//redirect page back to view page 
?> 
+0

'htmlspecialchars'很好,这是彻底的。 – tadman

+0

@tadman这是讽刺吗?很难说清楚文字:P – GrumpyCrouton

+0

不,我欣赏它。很少有人关注这一点。 XSS是一个严重的问题,我还没有精力去战斗,忙于SQL和蹩脚的登录系统。 – tadman

1

如果你希望你的ID来发布,它应该是这样的:

<form action="remove.php" method="post"> 
    <input type="hidden" name="id" value="<?php echo (int)$row['id']; ?>"> 
    <input type="submit" value="Remove Entry" /> 
</form> 

帖子名为id和值$row['id']的隐藏字段。

你应该照顾上面的注释,以避免在你的php中注入mysql。

+1

好的开始,但PHP代码中仍然存在很多问题。 – WheatBeak

+0

@WheatBeak是的,但问题只是“如何发送身份证”。 – steven

相关问题