PHP 中的 INSERT 查询失败(returns 空白错误)
INSERT query in PHP Failing (returns blank error)
我正在使用以下代码尝试将 <form>
中用户提供的值插入到 sql table 中。在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 ";
在这里,我尝试在查询周围使用双引号来形成一个字符串;我也省略了引号,但无济于事。另外,在 VALUES 中,我尝试了单引号和省略,但都没有成功。变量是双精度值,而不是字符串。
$vals = "INSERT INTO `Log` (`Trip`, `Odometer`, `Gallons_Pumped`,
`Price_Gallon`)
VALUES ('$trip', '$odom', '$gals', '$ppg')";
$retval
的return值为false,但没有报错。
$retval = mysql_query($vals);
if ($retval) {
echo "New record created successfully";
} else {
echo "Error: " . $vals . "<br>" . $retval->error;
}
mysql_close($conn);
?>
我的语法不正确吗?如果不是,为什么INSERT查询不成功?
您将 mysqli_*
函数与 mysql_*
函数混合在一起。你不能那样做;他们不是同一个图书馆。
仅使用 mysqli_*
。请 don't use mysql_*
; the mysql_*
functions are outdated, deprecated, and insecure. Use MySQLi
or PDO
代替。
代码的最后一个块应该是(未测试的):
$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->error
到 mysqli_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);
看起来您正在混合两个不兼容的 APIs - 已弃用的 mysql
函数式 API 和较新的面向对象的 mysqli
.
最好将您的代码转换为 mysqli
,它会起作用。
您的代码中还有另一个问题。您正在混合过程式调用和面向对象式调用。您在此代码中对有效连接的测试无效:
$conn = mysqli_connect($servername, $username, $db_name, $password);
// Check connection
if ($conn->connect_error) {
在程序风格中,如果连接失败,mysqli_connect
将不会 return 一个对象。所以 $conn
不会有 method/function connect_error
。您只需要测试 $conn
,然后调用程序样式 mysqli_connect_error
.
$conn = mysqli_connect($servername, $username, $db_name, $password);
if(!conn){
die("Connection failed: " . mysqli_connect_error);
}
另一种替代修复方法,将 $conn
的初始分配更改为面向对象的样式(即使用 new
)
我正在使用以下代码尝试将 <form>
中用户提供的值插入到 sql table 中。在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 ";
在这里,我尝试在查询周围使用双引号来形成一个字符串;我也省略了引号,但无济于事。另外,在 VALUES 中,我尝试了单引号和省略,但都没有成功。变量是双精度值,而不是字符串。
$vals = "INSERT INTO `Log` (`Trip`, `Odometer`, `Gallons_Pumped`,
`Price_Gallon`)
VALUES ('$trip', '$odom', '$gals', '$ppg')";
$retval
的return值为false,但没有报错。
$retval = mysql_query($vals);
if ($retval) {
echo "New record created successfully";
} else {
echo "Error: " . $vals . "<br>" . $retval->error;
}
mysql_close($conn);
?>
我的语法不正确吗?如果不是,为什么INSERT查询不成功?
您将 mysqli_*
函数与 mysql_*
函数混合在一起。你不能那样做;他们不是同一个图书馆。
仅使用 mysqli_*
。请 don't use mysql_*
; the mysql_*
functions are outdated, deprecated, and insecure. Use MySQLi
or PDO
代替。
代码的最后一个块应该是(未测试的):
$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->error
到 mysqli_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);
看起来您正在混合两个不兼容的 APIs - 已弃用的 mysql
函数式 API 和较新的面向对象的 mysqli
.
最好将您的代码转换为 mysqli
,它会起作用。
您的代码中还有另一个问题。您正在混合过程式调用和面向对象式调用。您在此代码中对有效连接的测试无效:
$conn = mysqli_connect($servername, $username, $db_name, $password);
// Check connection
if ($conn->connect_error) {
在程序风格中,如果连接失败,mysqli_connect
将不会 return 一个对象。所以 $conn
不会有 method/function connect_error
。您只需要测试 $conn
,然后调用程序样式 mysqli_connect_error
.
$conn = mysqli_connect($servername, $username, $db_name, $password);
if(!conn){
die("Connection failed: " . mysqli_connect_error);
}
另一种替代修复方法,将 $conn
的初始分配更改为面向对象的样式(即使用 new
)