【问题标题】:INSERT query in PHP Failing (returns blank error) [duplicate]PHP失败中的INSERT查询(返回空白错误)[重复]
【发布时间】:2016-01-16 05:17:32
【问题描述】:

我正在使用以下代码尝试将<form> 中用户提供的值插入到 sql 表中。在 PHPMyAdmin 中使用 INSERT 查询时,插入成功,但在下面的 php.ini 中插入不成功。连接数据库成功。

<?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 ";

在这里,我尝试在查询周围使用双引号来形成一个字符串;我也省略了引号,无济于事。此外,在 VALUES 中,我也尝试过单引号和省略号,但均未成功。变量是双精度值,而不是字符串。

 $vals = "INSERT INTO `Log` (`Trip`, `Odometer`, `Gallons_Pumped`,    
 `Price_Gallon`) 
 VALUES ('$trip', '$odom', '$gals', '$ppg')";

$retval的返回值为false,但没有提供错误。

$retval = mysql_query($vals);

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

mysql_close($conn);

?>

我的语法不正确吗?如果不是,为什么 INSERT 查询不成功?

【问题讨论】:

  • 混合两个扩展是个问题...
  • mysqli_connect 以及后续对有效连接的测试也存在问题。如果连接失败,$conn 将不是 mysqli 连接对象,也不会有 connect_error 方法函数/方法。在 $conn = mysqli_connect( 之后(如您的代码所示),您需要测试 if(!$conn){
  • 试试 echo $vals;看看查询是否正确..

标签: php mysql sql-insert


【解决方案1】:

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

仅使用mysqli_*。请don't use mysql_*; mysql_* 函数已过时、deprecated 且不安全。请改用MySQLiPDO

你的代码的最后一块应该是(未经测试的):

$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

注意从$retval-&gt;errormysqli_error($conn) 的变化。根据定义,如果您在代码中达到该点,那是因为 $retval 评估为 false,因此不是对象。


另外,请注意您对SQL injection 持开放态度。你的 SQL 语句是这样的:

$vals = "INSERT INTO `Log` (`Trip`, `Odometer`, `Gallons_Pumped`, `Price_Gallon`)
VALUES ('$trip', '$odom', '$gals', '$ppg')";

但这些值($trip 等)直接来自用户(通过$_REQUEST)。如果您的用户提交的值包含例如' 字符,则可能会发生非常糟糕的事情。你应该使用prepared statements,像这样:

$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);

【讨论】:

  • 太好了,谢谢!
  • 这是最好的答案我建议你添加sql注入指令chk OP code open for injection。 .如本例中提到的stackoverflow.com/questions/34781748/…
  • @devpro 好点。我添加了关于 SQL 注入的讨论。 Adrian,请查看答案的后半部分,了解更安全的做事方式。
【解决方案2】:

看起来您正在混合使用两种不兼容的 API - 已弃用的 mysql 功能 API 和较新的面向对象的 mysqli

最好将您的代码转换为mysqli,这样就可以了。

【讨论】:

【解决方案3】:

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

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

  // Check connection
  if ($conn->connect_error) {

在程序样式中,如果连接失败,mysqli_connect 将不会返回对象。所以$conn 不会有方法/函数connect_error。您只需测试$conn,然后调用程序样式mysqli_connect_error

  $conn = mysqli_connect($servername, $username, $db_name, $password);
  if(!conn){
     die("Connection failed: " . mysqli_connect_error);
  }

将初始分配更改为$conn 的另一种替代方法是面向对象的样式(即使用new

参考:http://php.net/manual/en/mysqli.construct.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多