我设法运行以下代码以在第一次尝试时插入我的表中。然后,我在 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,它仍然不起作用。
所以,不要对任何 SELECT 使用 PDO::exec()。我将代码更改为 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 文档,包括用户贡献。