gpt4 book ai didi

php - 使用 PHPMyAdmin 删除条目后无法将新数据插入 MySQL 数据库

转载 作者:行者123 更新时间:2023-11-29 00:42:53 25 4
gpt4 key购买 nike

我成功地运行了以下代码以在第一次尝试时插入到我的表中。然后,我删除了 PHPMyAdmin 中的该行以进一步测试我的代码。我还注意到它没有在第一次尝试时被删除。只有经过几次尝试。这可能是因为我在完成查询后没有将 $pdoHandle 设置为 NULL。

然后,不幸的是我无法在后续运行中插入新行。我什至尝试更改输入值并利用我无法插入新行。以下是我的 PHP 代码:

public function CreateNewCustomer($userId,$password,$name,$email)
{
$userId = filter_var($userId,FILTER_SANITIZE_STRING);
$password = filter_var($password,FILTER_SANITIZE_STRING);
$password = sha1($password);
$name = filter_var($name,FILTER_SANITIZE_STRING);
$email = filter_var($email,FILTER_SANITIZE_EMAIL);

do{
$customerId = hexdec(bin2hex(openssl_random_pseudo_bytes(4,$isStrong)));
echo $customerId;
$result = $this->connObject->exec("SELECT COUNT(id) FROM customer_tbl WHERE id=$customerId");
var_dump($result);
}while($result>0);

$statement = $this->connObject->prepare("INSERT INTO customer_tbl (id,name,email) VALUES ($customerId,:name,:email)");
$result = $statement->execute(array(':name'=>$name,':email'=>$email ));
var_dump($result);

$statement = $this->connObject->prepare("INSERT INTO login_tbl (username,password,customer_id) VALUES (:userName,PASSWORD(:password),$customerId)");
$result = $statement->execute(array(':userName'=>$userId,':password'=>$password ));
var_dump($result);
}

我使用下面的代码来访问上面的方法。

function Test($userName,$password,$name,$email)
{
try
{
$dbConnect = new DbConnect();
$pdoHandle = $dbConnect->Connect();
$userAccess = new UserAccess($pdoHandle);
$userAccess->CreateNewCustomer($userName,$password,$name,$email);
}
catch(PDOException $e)
{
$pdoHandle = null;
var_dump($e);
}
$pdoHandle = null;
}

Test('tester','password','TestX','test@example.com');

结果的 var_dump 总是错误的。

是我的代码有问题还是数据库有问题?

更新/解决方案:

我刚刚通读了关于 PDO::exec() 的 PHP 文档,其中一位用户提供的注释提到您不能使用任何 SELECT 语句(即使上面只返回计数值)和任何可能的语句返回一行。 PDO::exec() 的返回值是受影响的行数(整数),因此不能使用 PDOStatement::closeCursor() 来解决。即使我设置了 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>true,它仍然不起作用。

因此,不要将 PDO::exec() 用于任何 SELECT。我将代码改为 PDO::query(),如下所示,

   do{
$customerId = hexdec(bin2hex(openssl_random_pseudo_bytes(4,$isStrong)));
$statement = $this->connObject->query("SELECT COUNT(id) FROM customer_tbl WHERE id=$customerId");
$statement->execute();
}while($statement->fetchColumn(0)>0);

希望这对任何寻找具有类似问题的解决方案的人有所帮助,并始终记住首先阅读 PHP 文档,包括用户贡献。

最佳答案

也许不是答案,但如果您看不到明显的错误,可以执行以下操作:

如果执行返回 false,您可以通过以下方式获取有关发生的错误的更多信息:

$arr = $statement->errorInfo(); 
print_r($arr);

或者你可以设置不同的error reporting modes (例如抛出异常而不是默认的静默模式):

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

这应该可以帮助您找到“真正的”错误。

事实证明(请参阅问题下方的评论),在这种情况下,真正的错误是:

"Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY"

在这种情况下,您有 2 个选择:

您可以设置使用缓冲查询的选项

$dbh = new PDO(’mysql:host=localhost;dbname=test’, ‘root’, ” ,array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)) 

或更改您的代码并关闭打开的游标(可能取决于您使用的数据库驱动程序)。你总是应该阅读 documentation其中涵盖了很多默认问题。

希望这对您有所帮助。

关于php - 使用 PHPMyAdmin 删除条目后无法将新数据插入 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11494185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com