PHP MySQLi 预准备语句似乎不绑定或传递变量 - 但适用于 PDO prepare
PHP MySQLi prepared statements don't appear to bind or pass variables - but works with PDO prepare
我在使用最近停止工作的应用程序时遇到了一些问题,我无法弄清楚可能是什么问题。
从数据库读取工作正常,但是当我尝试插入或更新现有记录时,它不起作用。有时记录字段值被设置为 null 而不是变量值。
此应用程序目前 运行 在共享主机上运行,并且在一周前之前几个月都运行良好。我将 UAT 实例与另一个提供商一起放在另一台主机上,它似乎可以正常工作。
在我的调查过程中,我注意到如果我通过标准 PHP MYSQLi 程序语句更新或插入记录是正确的 updated/inserted,但是当我尝试通过准备好的方法绑定它时声明它不起作用。
PHP/MySQL没有抛出任何错误。
我尝试通过创建一个简单的测试脚本来简化事情,该脚本用一个值更新一条记录。
有效:
<?php
// Connection file
require 'connection.php';
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// set parameters and execute
$firstname = htmlspecialchars($_GET["firstname"]);
$sql = "UPDATE users SET first_name='$firstname' WHERE uid=1";
if ($conn->query($sql) === TRUE) {
echo "Updated record successfully";
} else {
echo "Error updating record: " . $conn->error;
}
$conn->close();
?>
虽然这不是:
<?php
// Connection file
require 'connection.php';
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// set parameters and execute
$firstname = htmlspecialchars($_GET["firstname"]);
// prepare and bind
$stmt = $conn->prepare("UPDATE users SET first_name=? WHERE uid =1");
$stmt->bind_param("s", $firstname);
$stmt->execute();
echo "Updated record successfully";
$stmt->close();
$conn->close();
?>
我正在 运行宁 PHP v7.0.30、Apache v2.4.33 和 MySQL v10.2.15 (MariaDB)
任何想法。这让我发疯...
我刚刚尝试为第二个示例返回受影响的行数。
printf("Affected rows (UPDATE): %d\n", $stmt ->affected_rows);
如果数据库table中的first_name有值,我运行脚本输出行数,它returns 'Affected rows 1'。当我检查数据库时,我可以看到该值现在为空。
这可能是什么原因造成的?可能是某种编码问题?
更新 1
刚刚添加 var_dump($stmt, $firstname);绑定后的第二个例子。
object(mysqli_stmt)#3 (10) { ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(1) ["field_count"]=> int(0) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(0) } string(3) "Bob"
受影响的行:1
和
object(mysqli_stmt)#3 (10) { ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(1) ["field_count"]=> int(0) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(0) } string(4) "Jack"
受影响的行:0`
更新 2
我开始认为这是服务器问题。
我刚刚测试了使用 PDO prepare 更新记录并且它正在运行。
<?php
// Connection file
require 'connection.php';
// set parameters
$firstname = $_GET["firstname"];
$id = 1;
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $conn->prepare("UPDATE users SET first_name=? WHERE uid=?");
$stmt->execute([$firstname,$id]);
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
当我尝试对 SELECT 执行准备好的语句时,我收到“503 服务不可用”。在本地工作正常。
<?php
// Connection file
require 'connection.php';
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// set parameters and execute
$id = 1;
//create a prepared statement
$query = "SELECT first_name FROM users WHERE uid=?";
$stmt = $conn->prepare($query);
$stmt ->bind_param('i', $id);
//execute query
$stmt ->execute();
//bind result variables
$stmt ->bind_result($first_name);
//fetch records
while($stmt ->fetch()) {
print $first_name;
}
//close connection
$stmt ->close();
mysqli_close($conn);
?>
最终更新 - 问题已解决
我的托管服务提供商能够解决这个问题。 nd_mysqli PHP 扩展似乎被禁用了。有了它,上面的例子就可以工作了,我的应用程序现在可以运行了。
最终更新 - 问题已解决
我的托管服务提供商能够解决该问题。 nd_mysqli PHP 扩展似乎被禁用了。有了它,上面的例子就可以工作了,我的应用程序现在可以运行了。
我在使用最近停止工作的应用程序时遇到了一些问题,我无法弄清楚可能是什么问题。
从数据库读取工作正常,但是当我尝试插入或更新现有记录时,它不起作用。有时记录字段值被设置为 null 而不是变量值。
此应用程序目前 运行 在共享主机上运行,并且在一周前之前几个月都运行良好。我将 UAT 实例与另一个提供商一起放在另一台主机上,它似乎可以正常工作。
在我的调查过程中,我注意到如果我通过标准 PHP MYSQLi 程序语句更新或插入记录是正确的 updated/inserted,但是当我尝试通过准备好的方法绑定它时声明它不起作用。
PHP/MySQL没有抛出任何错误。
我尝试通过创建一个简单的测试脚本来简化事情,该脚本用一个值更新一条记录。
有效:
<?php
// Connection file
require 'connection.php';
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// set parameters and execute
$firstname = htmlspecialchars($_GET["firstname"]);
$sql = "UPDATE users SET first_name='$firstname' WHERE uid=1";
if ($conn->query($sql) === TRUE) {
echo "Updated record successfully";
} else {
echo "Error updating record: " . $conn->error;
}
$conn->close();
?>
虽然这不是:
<?php
// Connection file
require 'connection.php';
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// set parameters and execute
$firstname = htmlspecialchars($_GET["firstname"]);
// prepare and bind
$stmt = $conn->prepare("UPDATE users SET first_name=? WHERE uid =1");
$stmt->bind_param("s", $firstname);
$stmt->execute();
echo "Updated record successfully";
$stmt->close();
$conn->close();
?>
我正在 运行宁 PHP v7.0.30、Apache v2.4.33 和 MySQL v10.2.15 (MariaDB)
任何想法。这让我发疯...
我刚刚尝试为第二个示例返回受影响的行数。
printf("Affected rows (UPDATE): %d\n", $stmt ->affected_rows);
如果数据库table中的first_name有值,我运行脚本输出行数,它returns 'Affected rows 1'。当我检查数据库时,我可以看到该值现在为空。
这可能是什么原因造成的?可能是某种编码问题?
更新 1
刚刚添加 var_dump($stmt, $firstname);绑定后的第二个例子。
object(mysqli_stmt)#3 (10) { ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(1) ["field_count"]=> int(0) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(0) } string(3) "Bob"
受影响的行:1
和
object(mysqli_stmt)#3 (10) { ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(1) ["field_count"]=> int(0) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(0) } string(4) "Jack"
受影响的行:0`
更新 2
我开始认为这是服务器问题。 我刚刚测试了使用 PDO prepare 更新记录并且它正在运行。
<?php
// Connection file
require 'connection.php';
// set parameters
$firstname = $_GET["firstname"];
$id = 1;
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $conn->prepare("UPDATE users SET first_name=? WHERE uid=?");
$stmt->execute([$firstname,$id]);
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
当我尝试对 SELECT 执行准备好的语句时,我收到“503 服务不可用”。在本地工作正常。
<?php
// Connection file
require 'connection.php';
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// set parameters and execute
$id = 1;
//create a prepared statement
$query = "SELECT first_name FROM users WHERE uid=?";
$stmt = $conn->prepare($query);
$stmt ->bind_param('i', $id);
//execute query
$stmt ->execute();
//bind result variables
$stmt ->bind_result($first_name);
//fetch records
while($stmt ->fetch()) {
print $first_name;
}
//close connection
$stmt ->close();
mysqli_close($conn);
?>
最终更新 - 问题已解决
我的托管服务提供商能够解决这个问题。 nd_mysqli PHP 扩展似乎被禁用了。有了它,上面的例子就可以工作了,我的应用程序现在可以运行了。
最终更新 - 问题已解决
我的托管服务提供商能够解决该问题。 nd_mysqli PHP 扩展似乎被禁用了。有了它,上面的例子就可以工作了,我的应用程序现在可以运行了。