Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 写PDO update语句的正确方法_Php_Mysql_Pdo - Fatal编程技术网

Php 写PDO update语句的正确方法

Php 写PDO update语句的正确方法,php,mysql,pdo,Php,Mysql,Pdo,这是编写PDO update语句的正确方法吗?我是根据我在网上看到的一个教程编写的,但是当被AJAX激发时,它似乎什么都没有做(即使AJAX请求在控制台中被记录为成功,但没有对数据库进行更新): PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION这有助于找到错误 使用try和catch可以得到一条回音错误消息,说明失败的位置和原因。是的,它是正确的,但您需要告诉PDO在出错时发出错误。 因此,将您的连接代码设置为: $dsn = "mysql:host=$host;

这是编写PDO update语句的正确方法吗?我是根据我在网上看到的一个教程编写的,但是当被AJAX激发时,它似乎什么都没有做(即使AJAX请求在控制台中被记录为成功,但没有对数据库进行更新):

PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION
这有助于找到错误


使用
try
catch
可以得到一条
回音
错误消息,说明失败的位置和原因。

是的,它是正确的,但您需要告诉PDO在出错时发出错误。
因此,将您的连接代码设置为:

$dsn = "mysql:host=$host;dbname=$db;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $user, $pass, $opt);
并确保您可以看到PHP错误。因此,您将知道出了什么问题。

这里有一个非常好的方法来理解PDO

正确的方法是:

// Named Placeholders
$sSql  = "UPDATE mytable SET FName = :FName, LName = :LName, Age = :Age, Gender = :Gender WHERE ID = :ID;";

// PDO prepared statement
$oSth = $oDbh->prepare($sSql);

// Bind Named Placeholders
$oSth->bindParam(":FName", $FName, PDO::PARAM_STR);
$oSth->bindParam(":LName", $LName, PDO::PARAM_STR);
$oSth->bindParam(":Age", $Age, PDO::PARAM_INT);
$oSth->bindParam(":Gender", $Gender, PDO::PARAM_STR);
$oSth->bindParam(":ID", $ID, PDO::PARAM_INT);

// Execute PDO with condition
if ($oSth->execute()) {
    // Get Affected row
    $iAffectedRows = $oSth->rowCount();
    $oSth->closeCursor();
    return $iAffectedRows;
} else {
    // PDO error, could also be caught in a try/catch statement
    $errorMsg = $oSth->errorInfo();
    error_log(json_encode($errorMsg));
}

你没有做任何错误检查。prepare()方法可能会失败,execute()方法也可能会失败(返回FALSE或NULL,或者引发异常,具体取决于您如何配置PDO)。您需要检查是否没有抛出错误。如果使用异常,则不需要手动检查为什么要应用htmlspecialchars?没有理由这样做可以解决问题。用try-catch包装每个语句是一种不好的做法。仅当您想绕过错误时才执行此操作。否则,它必须由主异常处理程序处理。无条件地回显错误消息也是不好的。您能解释一下为什么会发生这样的情况吗?问题是,在捕获并处理异常之后,执行将继续。这可能正是您想要的,但在其他情况下,异常可能表明发生了无法恢复的情况。这比OP中的代码多得多。有什么理由写这些东西吗?PDO擅长于“惰性绑定”,PHP擅长于错误处理。不需要手动重写这些东西。不,不需要在这里写所有东西。但是,我写这篇文章是为了更好地理解PDO…:)您应该使用
try
catch
$dsn = "mysql:host=$host;dbname=$db;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $user, $pass, $opt);
// Named Placeholders
$sSql  = "UPDATE mytable SET FName = :FName, LName = :LName, Age = :Age, Gender = :Gender WHERE ID = :ID;";

// PDO prepared statement
$oSth = $oDbh->prepare($sSql);

// Bind Named Placeholders
$oSth->bindParam(":FName", $FName, PDO::PARAM_STR);
$oSth->bindParam(":LName", $LName, PDO::PARAM_STR);
$oSth->bindParam(":Age", $Age, PDO::PARAM_INT);
$oSth->bindParam(":Gender", $Gender, PDO::PARAM_STR);
$oSth->bindParam(":ID", $ID, PDO::PARAM_INT);

// Execute PDO with condition
if ($oSth->execute()) {
    // Get Affected row
    $iAffectedRows = $oSth->rowCount();
    $oSth->closeCursor();
    return $iAffectedRows;
} else {
    // PDO error, could also be caught in a try/catch statement
    $errorMsg = $oSth->errorInfo();
    error_log(json_encode($errorMsg));
}