- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个函数,以便在 sql 查询中更轻松地使用准备好的语句。但是在处理它的过程中,我遇到了一个奇怪的错误。
当您运行第一个 var_dump
下面的代码时的 $response
打印 $stmt
像我期望的那样变量,但是在关闭 $stmt
之后它给出了很多警告并打印了一个 NULL 填充版本的 $stmt
.我只复制 $stmt 为 $response
,所以我没想到 $response
关闭时更改 $stmt
.
有人可以解释为什么会发生这种情况以及我如何防止它?
function sql_bug() {
global $dbc; // Database connection
$sql = "UPDATE users SET username = 'J0R1AN' WHERE id = 1"; // Test query
if ($stmt = $dbc->prepare($sql)) {
if ($stmt->execute()) {
$response = $stmt->get_result();
if ($response === false) {
// Checks for e.g. UPDATE queries that return bool(false) instead of a mysqli_result,
// and sets $response to $stmt instead, to return more valuable information when using UPDATE
$response = $stmt;
}
var_dump($response); // Prints expected $stmt variable
$stmt->close(); // Somehow changes $response?
var_dump($response); // Prints $stmt variable filled with NULLS
return $response;
}
}
return false;
}
最佳答案
变量赋值不会在 PHP 中创建对象的新副本。要创建副本,您需要使用 clone
.简单的例子:
$obj = (object) ['a'=>42];
$new_obj = $obj;
$obj->a = 100;
var_dump($new_obj);
// outputs
// stdClass Object
// (
// [a] => 100
// )
您已成为多种谬论的受害者。
close
任何事物。 PHP 会为你做的。使用 close
只会使很多事情复杂化。 prepare
的返回值或 execute
职能。而是启用 mysqli 错误报告。 How to get the error message in MySQLi? mysqli_stmt
或 mysqli_result
函数之外的对象。执行语句并获取数据后,您可以丢弃它们。 function sql_bug(\mysqli $dbc, string $sql, array $params = []): ?array {
$stmt = $dbc->prepare($sql);
if ($params) {
// bind optional parameters if the query has variable input
$stmt->bind_param(str_repeat("s", count($params)), ...$params);
}
$stmt->execute();
$response = $stmt->get_result();
if ($response) {
// If the query returned results then fetch them into an array and return it
return $response->fetch_all(MYSQLI_BOTH);
}
// return nothing if the query was successfully executed and it didn't produce results
return null;
}
上面的函数是一个泛型函数,可以处理任何带参数和不带参数的SQL语句。如果查询是 INSERT 或 UPDATE 它不会返回任何东西,如果它是 SELECT 它将返回数组中的数据。无需复制或返回内部对象。您正在编写一个函数来从 mysqli 内部进行抽象。
关于PHP:mysqli_stmt->close() 影响 stmt 的早期副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63178884/
我无法确定以下 ruby 内联救援代码有什么问题 def test_check() p "first st" t = 5 * lsdj rescue return false p "second
在完成准备好的 mysqli$stmt->close() 和 $stmt->free_result() 之间的区别强>声明。 到目前为止我使用: $mysqli = new mysqli(host,u
我正在尝试登录,输入用户名和密码,如果未显示“同意元素”或显示“管理标题元素”,则编写一个条件,然后单击管理元素,但我的代码仅检查我同意元素不存在显示并抛出异常。 driver.get("ente
根据 php 手册,您可以通过询问 $stmt->error 和 $stmt->errno 来检索任何准备好的语句方法中的错误,但是 bind_param 方法似乎从来没有将这些设置为错误,其他人可以
你能帮我编写高效的 Java 代码吗? 逻辑是:我必须读取文件中的第一个有效记录并生成文件名。无效/有效记录由该行的前 2 个字符标识。无效记录的前 2 个字符填充在名为ignoreTrans 的 A
我试图从下面的代码中获取结果,但是没有返回任何结果。 $stmt->execute(array(id)) 未按预期运行。它似乎在其他代码段中工作正常,我已经比较了它们,没有发现任何差异。 $stmt
我正在尝试检查从 cookie 中检索到的 id 是否存在于数据库中,但是这部分代码 $stmt->bind_result($id, $uname); 和 $username = $uname; 按照
我已经准备好阅读所有其他主题,但没有找到解决方案。这是我的代码 $DevolverUser = $_SESSION['DevolverUser']; $DevolverPas
我正在尝试准备一个mysqli查询,但是它在没有给出任何错误的情况下以静默方式失败。 $db_hostname = "test.com"; $db_database = "dbname";
我想知道 1.java中语句关闭的目的 2.如果我没有在程序中提供 stmt.close() 会发生什么 try{ Statement DelQTY=OPConnect.crea
需要帮助来完成这个简单的任务。该 sp 应该提供一个结果集,并将从 MS-Access-Database 报告目的中调用。 表名可变,但以数字 (lsid) 结尾。使用串联。max_prepared_
我有一个带有 echo 的 php 代码来检查它停止的位置(它不会崩溃,但会停止发送 echo 并且不能按预期工作) $stmt=$conexion->prepare("SELECT Email, M
我不明白我做错了什么。 我在 SQL Server 中有一个存储过程,我需要迁移到 MySQL。 当我运行与打印相同的查询时,该查询正在工作,但相同的变量无法生成准备语句,从而导致语法错误。 Erro
我正在我的事件网站上创建搜索过滤器。有 3 个下拉输入:位置、事件类型、日期。 当用户提交搜索过滤器时,表单会发布更改 mysql 查询的值,这将在用户屏幕上显示不同的事件。我无法找到灵活的解决方案。
我如何mysqli::stmt->bind_param在mysql中被视为NULL的东西? 我目前正在使用 $stmt->bind_param('s', 'NULL'); 最佳答案 bind_para
我在此处运行准备 stmt 时遇到语法错误。我尝试手动执行 @c 中的查询并且它有效。不知道为什么 stmt 会给出这个错误。这是我正在使用的代码。 SET @i=24; SET @Bill_mont
当 ($stmt->fetch()) 服务器不会读取过去 if (isset($_POST['join'])) { $selectedgame = $_POST['join']; $stmt = $l
我的代码: $stmt = $user_home->runQuery("SELECT * FROM tbl_users, tbl_products WHERE userID=:uid and crea
我不明白为什么我的函数没有得到结果而只是得到空值。我正在使用 PhpStorm;我的所有连接都很好(Apache、MySQL、PhpMyAdmin),我已经检查过它们,其他其他服务也正常工作。 这是我
这个问题在这里已经有了答案: Why does mysqli num_rows always return 0? (1 个回答) 关闭 6 年前。 我想检查 if ($numRows >= 1) 那
我是一名优秀的程序员,十分优秀!