PDO delete 不工作并且不抛出错误(添加 base64 时)
PDO delete is not working and not throwing errors (when adding base64)
我需要通过 PDO 从 table 中删除一条记录。我做了一些代码(与下面没有 base64 编码的代码相同)并且它有效。然后我在我的数据库和发送到 MySQL 的参数上添加了 base64_encoding。由于各种原因需要这样做,所以我不能放弃 base64 编码。不幸的是,这破坏了它(数据库中没有任何反应)。我不知道如何调试它,因为查询不会引发错误。我按照这个 guide 尝试调试它,但没有引发错误或被记录。有谁知道 base64 格式(例如:'siecX==')通常会导致 MySQL 或 PDO 出现问题?
我的代码:
<?php
$dbname="dbname";
$table="whitelisted_parameters";
session_start();
include_once(dirname(__DIR__)."../../config/database_conf.php");
try {
$conn = new PDO("mysql:host=$hostname; dbname=$dbname", $username, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql= "DELETE FROM $table WHERE virtual_host_id=:id_virtual_host_selected AND `page`=:page AND `parameter`=:parameter AND `method`=:method";
$stmt = $conn->prepare($sql);
$stmt->bindParam(":id_virtual_host_selected", $_SESSION['id_virtual_host_selected'], PDO::PARAM_INT);
$fap=base64_encode($_POST['page']);
echo $fap."||";// I used a temp value to log the variables
$stmt->bindParam(":page", $fap, PDO::PARAM_STR);
$fap=base64_encode($_POST['parameter']);
echo $fap."||";
$stmt->bindParam(":parameter", $fap, PDO::PARAM_STR);
$fap=base64_encode($_POST['method']);
echo $fap."||";
$stmt->bindParam(":method", $fap, PDO::PARAM_STR);
$stmt->execute();
// Close DB connection
$dbh = null;
echo "parameter is removed";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
你混淆了 bindParam
and bindValue
调用。
在前者中,使用了对变量的引用,而在后者中,使用了值本身。
通过查看它们的用法语法会更清楚:
public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
和
public bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )
我需要通过 PDO 从 table 中删除一条记录。我做了一些代码(与下面没有 base64 编码的代码相同)并且它有效。然后我在我的数据库和发送到 MySQL 的参数上添加了 base64_encoding。由于各种原因需要这样做,所以我不能放弃 base64 编码。不幸的是,这破坏了它(数据库中没有任何反应)。我不知道如何调试它,因为查询不会引发错误。我按照这个 guide 尝试调试它,但没有引发错误或被记录。有谁知道 base64 格式(例如:'siecX==')通常会导致 MySQL 或 PDO 出现问题? 我的代码:
<?php
$dbname="dbname";
$table="whitelisted_parameters";
session_start();
include_once(dirname(__DIR__)."../../config/database_conf.php");
try {
$conn = new PDO("mysql:host=$hostname; dbname=$dbname", $username, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql= "DELETE FROM $table WHERE virtual_host_id=:id_virtual_host_selected AND `page`=:page AND `parameter`=:parameter AND `method`=:method";
$stmt = $conn->prepare($sql);
$stmt->bindParam(":id_virtual_host_selected", $_SESSION['id_virtual_host_selected'], PDO::PARAM_INT);
$fap=base64_encode($_POST['page']);
echo $fap."||";// I used a temp value to log the variables
$stmt->bindParam(":page", $fap, PDO::PARAM_STR);
$fap=base64_encode($_POST['parameter']);
echo $fap."||";
$stmt->bindParam(":parameter", $fap, PDO::PARAM_STR);
$fap=base64_encode($_POST['method']);
echo $fap."||";
$stmt->bindParam(":method", $fap, PDO::PARAM_STR);
$stmt->execute();
// Close DB connection
$dbh = null;
echo "parameter is removed";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
你混淆了 bindParam
and bindValue
调用。
在前者中,使用了对变量的引用,而在后者中,使用了值本身。
通过查看它们的用法语法会更清楚:
public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
和
public bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )