我正在使用以下php脚本在我的MySQL数据库中插入数据。但是没有插入任何行..当我在phpmyadmin中运行相同的sql查询时它工作正常。
<?php
if(isset($_POST['submit']) && isset($_POST['Pnr']) && isset($_POST['Mobile']))
{
$hostname = "";
$username = "";
$password = "";
$Pnr = $_POST['Pnr'];
$Mobile = $_POST['Mobile'];
$con = mysql_connect($hostname,$username,$password);
if(!$con)
{
die("Could not connect to Database");
}
mysql_select_db("freepnra_userinfo",$con);
$sql = "INSERT INTO users (pnr,mobile) VALUES ('$Pnr','$Mobile')";
mysql_query($sql) or die("insertion error");
}
?>
答案 0 :(得分:1)
我不完全确定它不起作用的实际原因是什么,但我怀疑是SQL查询嵌套还是已弃用的MySQL数据库扩展问题。
我测试了以下代码,似乎对我完美无缺。
<?php
if (isset($_POST['submit']) && isset($_POST['Pnr']) && isset($_POST['Mobile'])) {
$hostname = "";
$username = "";
$password = "";
$database = "freepnra_userinfo";
$Pnr = $_POST['Pnr'];
$Mobile = $_POST['Mobile'];
$con = mysqli_connect($hostname, $username, $password, $database);
if (mysqli_connect_errno()) {
die("<p>Could not connect to database with the credentials passed in (" . mysqli_connect_errno() . ": " . mysqli_connect_error() . ").");
exit(1);
}
$Pnr = preg_replace("/[^0-9-]/", "", $Pnr);
$Mobile = preg_replace("/[^0-9-]/", "", $Mobile);
$sql = "INSERT INTO `users` (`pnr`, `mobile`) VALUES (?, ?)";
if ($stmt = mysqli_prepare($con, $sql)) {
mysqli_stmt_bind_param($stmt, "ss", $Pnr, $Mobile);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
}
mysqli_close($con);
}
?>
我做的是,我嵌套了表名,列名,而不是将变量值直接放入查询中,我放置了双撇号。
我也改为MySQLi database extension而不是deprecated MySQL。另外,我想警告你一个非常严重的SQL injection问题,我通过使用预准备语句和一些额外的preg_replace
函数解决了这个问题,只是为了将所有不需要的字符保留在查询和表之外一般来说。我不完全确定这些值应该包含什么,所以我继续假设你想要两个不同的电话号码(这就是为什么我只允许从0到9和破折号的数字)。
此外,我想请您阅读以下材料,以了解一些更好的方法来保护您的查询以防止潜在的SQL注入:
如果可能,我强烈建议您切换到MySQL PDO。在我看来,它非常简单,容易并且效果更好!
希望这能帮到你!
答案 1 :(得分:0)
因为你的第一个if没有else
语句,如果它没有评估为true,你无意知道发生了什么。在脚本末尾添加else语句:
else {
echo 'problem with post data';
}
另外,给自己一个巨大的优势并阅读有关PDO的内容。它有一种方法可以使用预先设定的fetch模式来覆盖我所说的mysqli,并且你可以使用预先构建的获取模式做很多事情。假设$PDO
是有效的PDO连接,该单行将为您提供多维关联数组中表中的所有行:
$rows = $PDO->query('SELECT * FROM table JOIN table2 USING (id)')->fetchAll(PDO::FETCH_ASSOC);
你可以用foreach迭代。耦合在一起,fetchAll和foreach将在while ($row = mysqli_fetch_assoc())
foreach ($rows as $row) {
// do whatever with your cool array of values
}
答案 2 :(得分:-1)
我认为您需要将查询编写为
$sql = mysql_query("INSERT INTO `users` (pnr,mobile) VALUES ('$Pnr','$Mobile')");