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

使用PHPMyAdmin删除条目后,无法将新数据插入MySQL数据库,php,mysql,pdo,phpmyadmin,Php,Mysql,Pdo,Phpmyadmin,第一次尝试时,我成功地运行了以下代码插入到我的表中。然后,我删除了PHPMyAdmin中的那一行,以进一步测试我的代码。我还注意到它在第一次尝试时没有被删除。只有几次尝试之后。这可能是因为我在完成查询后没有将$pdoHandle设置为NULL 然后,很遗憾,我无法在后续运行中插入新行。我甚至试图更改输入值,但我无法插入新行。以下是我的PHP代码: public function CreateNewCustomer($userId,$password,$name,$email) { $us

第一次尝试时,我成功地运行了以下代码插入到我的表中。然后,我删除了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_转储总是错误的

我的代码有问题吗?或者数据库有问题吗

更新/解决方案:

我刚刚阅读了关于PDO::exec()的PHP文档,其中一条用户提供的注释提到,您不能使用任何SELECT语句(即使上面的语句只返回count值)和任何可能返回行的语句。PDO::exec()的返回值是受影响的行数(整数),因此无法使用PDO语句::closeCursor()来解决该问题。即使我将PDO::MYSQL\u ATTR\u USE\u BUFFERED\u QUERY=>true设置为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文档,包括用户的贡献

我假设该方法在UserAccess类中,并且您传入的连接设置为本地
$this->connObject

我怀疑在删除记录之后,$customerId在您使用select语句的有趣的do while循环中被设置为null。如果DB中的id列是非null主键字段,并且您尝试插入显式null,则会失败


此外,无需继续将DB连接设置为null。。。这不是C语言,连接也不是持久的(除非您显式地声明它们是持久的)

我假设该方法在UserAccess类中,并且您传入的连接设置为本地
$this->connObject

我怀疑在删除记录之后,$customerId在您使用select语句的有趣的do while循环中被设置为null。如果DB中的id列是非null主键字段,并且您尝试插入显式null,则会失败


此外,无需继续将DB连接设置为null。。。这不是C语言,连接也不是持久的(除非您显式地声明它们是持久的)

也许不是答案,但如果你看不到明显的错误,你可以做以下几件事:

如果execute返回false,您可以通过以下方式获得有关错误的更多信息:

$arr = $statement->errorInfo(); 
print_r($arr);
或者,您可以设置不同的模式(例如,抛出异常而不是defaultsilent模式):

这将帮助您找到“真正的”错误

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

“当其他未缓冲查询处于活动状态时,无法执行查询。 考虑使用pdoCalp::FuffAccess(),或者,如果您的代码 只在mysql上运行,您可以启用查询 通过设置PDO::MYSQL\u ATTR\u USE\u BUFFERED\u查询进行缓冲”

在这种情况下,您有两个选项:

您可以将该选项设置为使用缓冲查询

$dbh = new PDO(’mysql:host=localhost;dbname=test’, ‘root’, ” ,array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)) 
或者更改代码并关闭打开的光标(可能取决于您使用的db驱动程序)。您应该始终阅读包含许多默认问题的


希望这能有所帮助。

也许不是答案,但如果您发现明显的错误,可以采取以下措施:

如果execute返回false,您可以通过以下方式获得有关错误的更多信息:

$arr = $statement->errorInfo(); 
print_r($arr);
或者,您可以设置不同的模式(例如,抛出异常而不是defaultsilent模式):

这将帮助您找到“真正的”错误

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

“当其他未缓冲查询处于活动状态时,无法执行查询。 考虑使用pdoCalp::FuffAccess(),或者,如果您的代码 只在mysql上运行,您可以启用查询 通过设置PDO::MYSQL\u ATTR\u USE\u BUFFERED\u查询进行缓冲”

在这种情况下,您有两个选项:

您可以将该选项设置为使用缓冲查询

$dbh = new PDO(’mysql:host=localhost;dbname=test’, ‘root’, ” ,array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)) 
或者更改代码并关闭打开的光标(可能取决于您使用的db驱动程序)。您应该始终阅读包含许多默认问题的


希望这能有所帮助。

我确实试着四处寻找类似问题的答案,但找不到任何答案,而且大多数问题都使用了旧的“mysql_*”函数。我想您可能遇到了一个错误(因为返回值为false)。我看不出明显的错误。我建议在执行语句后输出以下内容(以获取更多错误信息):
$arr=$statement->errorInfo();印刷费($arr)你好,Bernhard,看起来有一个未缓冲的查询处于活动状态。这里是Error信息:“当其他未缓冲查询激活时,无法执行查询。请考虑使用PDOCHATME::FETCAUTHER()。如果您的代码只运行MySQL,则可以通过设置PDO:MyQuxLtAutoSuffBuffReDeEngQuess启用查询缓冲。”缓冲和非缓冲的区别是什么?我不是PDO专家,但我认为您可以配置在创建句柄时是否应该使用缓冲
$dbh=new PDO('mysql:host=localhost;dbname=test','root',',“,array(PDO::mysql\u ATTR\u USE\u buffered\u QUERY=>true))
我想问题在于您的while循环(不读取所有内容/不关闭连接/语句)当您从数据库获取数据,但不读取所有返回的数据时,它有一些作用。有关详细信息,请参阅。非常感谢,Bern