【问题标题】:PHP MYSQL Couldn't execute query: Unknown columnPHP MYSQL 无法执行查询:未知列
【发布时间】:2013-08-04 19:33:45
【问题描述】:

请帮我解决这个问题。第一个查询将返回一条消息,说明

Couldn't execute query: Unknown column 'ssd23' in 'where clause.

ssd23$_POST 将从 html 表单中为 pnumber 获取的值。但是,如果只有数字,它会起作用。

$result = mysqli_query($con, "DELETE FROM Tools WHERE PartNumber = {'$_POST['pnumber']'}") or die ("Couldn't execute query: " .mysqli_error($con));

使用变量后,下面的第二个查询将同时处理数字和字符。

$test = $_POST['pnumber'];                  
$result = mysqli_query($con, "DELETE FROM Tools WHERE PartNumber = '$test'") or die ("Couldn't execute query: " .mysqli_error($con)); 

【问题讨论】:

  • 这段代码中存在SQL注入漏洞,这意味着您的网站将在短时间内被黑客入侵。请不要使用此代码!
  • 使用准备好的语句将动态输入传递给 SQL 查询。它们专为提高安全性而设计,并且它们将帮助您在未来避免此特定问题。
  • value 周围显然缺少引号,然后将其视为字段名称。有趣的是,你无意中利用了你自己代码的 SQL 注入漏洞:D
  • 感谢您就 SQL 注入向我发出警告。我读了一些关于它的内容,并得到了广泛的想法。我正在学习 PHP 并建立一个带有数据库的练习网站。使用登录后可用的 SQL 界面。:) 感谢 Sylvain Leroux 指出缺少的引号,这有点回答了我的问题 :)

标签: php mysql


【解决方案1】:

替换这个:

$result = mysqli_query($con, "DELETE FROM Tools WHERE PartNumber = {'$_POST['pnumber']'}") or die ("Couldn't execute query: " .mysqli_error($con));

有了这个:

$result = mysqli_query($con, "DELETE FROM Tools WHERE PartNumber = '" . $_POST['pnumber'] ."'") or die ("Couldn't execute query: " .mysqli_error($con));

请注意我没有处理上面的 sql 注入

更好的是使用准备语句来保护您的查询,在您的情况下,它将是这样的:

$sql= 'DELETE FROM Tools WHERE PartNumber= ?';      

$stmt = $con->prepare($sql); 
$stmt->bind_param('i', $_POST['pnumber']);
$stmt->execute();

【讨论】:

  • 嗨佩里。您在示例中复制了 OP 的安全漏洞。如果您看到 $_POST 或其他用户输入添加到查询中而没有转义或参数化,请务必警告 OP 他们的代码不安全。
  • @halfer,我现在添加一个比第一个选项更好的准备语句示例:)
  • 好东西佩里! +1
  • 谢谢佩里!谷歌说准备好的语句是这样做的方法,而不是 mysqli_real_escape_string 或我可能想出的任何东西:) 到目前为止一直在使用在线教程。我仍在学习过程和面向对象的 PHP,将两者混合在一起:(
猜你喜欢
  • 2016-08-30
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多