在PHP中插入查询失败(返回空白错误)

在PHP中插入查询失败(返回空白错误),php,mysql,sql-insert,Php,Mysql,Sql Insert,我使用以下代码试图将用户提供的值插入到sql表中。在PHPMyAdmin中使用INSERT查询时,插入成功,但在以下php中不成功。已成功连接到数据库 <?php $servername = "localhost"; $username = "***"; $password = "***"; $db_name = "my_db"; $trip; $odom; $gals; $ppg; if (isset($_REQUEST['trip'])){ $trip = $_REQUEST['t

我使用以下代码试图将用户提供的值插入到sql表中。在PHPMyAdmin中使用INSERT查询时,插入成功,但在以下php中不成功。已成功连接到数据库

<?php
$servername = "localhost";
$username = "***";
$password = "***";
$db_name = "my_db";
$trip;
$odom;
$gals;
$ppg;

if (isset($_REQUEST['trip'])){

$trip = $_REQUEST['trip'];
$odom = $_REQUEST['odom'];
$gals = $_REQUEST['gals'];
$ppg = $_REQUEST['ppg'];

} 

// Create connection
$conn = mysqli_connect($servername, $username, $db_name, $password);

// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully ";
$retval的返回值为false,但未提供任何错误

$retval = mysql_query($vals);

if ($retval) {
echo "New record created successfully";
} else {
echo "Error: " . $vals . "<br>" . $retval->error;
}

mysql_close($conn);

?>
我的语法不正确吗?如果没有,为什么插入查询不成功?

您将mysqli_*函数与mysql_*函数混合使用。你不能那样做;它们不是同一个图书馆

仅使用mysqli_u173。请mysql_*函数已经过时,而且不安全。使用或代替

应未测试代码的最后一块:

$retval = mysqli_query($vals); // changed

if ($retval) {
    echo "New record created successfully";
} else {
    echo "Error: " . $vals . "<br>" . mysqli_error($conn); // changed
}

mysqli_close($conn); // changed
但是$trip等值直接来自用户通过$\u请求。如果用户提交的值中包含例如“字符”,则可能会发生非常糟糕的情况。您应该像这样使用:

$vals = "INSERT INTO `Log` (`Trip`, `Odometer`, `Gallons_Pumped`, `Price_Gallon`)
VALUES (?, ?, ?, ?)";

if($stmt = mysqli_prepare($conn, $vals)) {
    // adjust "sddd" below to match your data types; see http://php.net/manual/en/mysqli-stmt.bind-param.php
    mysqli_stmt_bind_param($stmt, "sddd", $trip, $odom, $gals, $ppg);

    $retval = mysqli_stmt_execute($stmt);
} else {
    echo "Error: " . $vals . "<br>" . mysqli_error($conn);
}

mysqli_close($conn);

看起来您混合了两种不兼容的API—不推荐使用的mysql函数API和较新的面向对象的mysqli


最好将您的代码转换为mysqli,它就会工作。

您的代码中还有另一个问题。你混合了过程风格和面向对象风格的调用。您在此代码中对有效连接的测试无效:

  $conn = mysqli_connect($servername, $username, $db_name, $password);

  // Check connection
  if ($conn->connect_error) {
在过程样式中,如果连接失败,mysqli_connect将不会返回对象。因此$conn不会出现方法/函数connect\U错误。您只需要测试$conn,然后调用程序样式mysqli\u connect\u error

另一个将初始分配更改为$conn的替代修复程序是面向对象的,即使用新的


参考资料:

非常好,谢谢!这是最好的答案,我建议你添加sql注入指令chk操作代码打开注入。如本例所述@devpro很好。我添加了一个关于SQL注入的讨论。Adrian,请查看答案的后半部分,了解更安全的操作方式。混合使用两个扩展是一个问题…例如,如何使用PDO mysqli_connect以及后续的有效连接测试也存在问题。如果连接失败,$conn将不是mysqli连接对象,也不会有connect\u error方法函数/方法。在代码中显示的$conn=mysqli\u连接之后,您需要测试一下$conn{.Try echo$vals;并查看查询是否正确..这里是PDO的示例
$vals = "INSERT INTO `Log` (`Trip`, `Odometer`, `Gallons_Pumped`, `Price_Gallon`)
VALUES (?, ?, ?, ?)";

if($stmt = mysqli_prepare($conn, $vals)) {
    // adjust "sddd" below to match your data types; see http://php.net/manual/en/mysqli-stmt.bind-param.php
    mysqli_stmt_bind_param($stmt, "sddd", $trip, $odom, $gals, $ppg);

    $retval = mysqli_stmt_execute($stmt);
} else {
    echo "Error: " . $vals . "<br>" . mysqli_error($conn);
}

mysqli_close($conn);
  $conn = mysqli_connect($servername, $username, $db_name, $password);

  // Check connection
  if ($conn->connect_error) {
  $conn = mysqli_connect($servername, $username, $db_name, $password);
  if(!conn){
     die("Connection failed: " . mysqli_connect_error);
  }