我使用CS50 2014中的以下功能,当我选择它时它正在工作,但是当我尝试更新时它无法正常工作。这是查询和功能:
query(
"UPDATE users
SET pwtxt = ?, pass = ?, dt = ?, reset = ?
WHERE usr = ?",
NULL,
"compass",
NULL,
0,
1
);
function query(/* $sql [, ... ] */)
{
// SQL statement
$sql = func_get_arg(0);
// parameters, if any
$parameters = array_slice(func_get_args(), 1);
// try to connect to database
static $handle;
if (!isset($handle))
{
try
{
// connect to database
$handle = new PDO("mysql:dbname=" . DATABASE . ";host=" . SERVER, USERNAME, PASSWORD);
// ensure that PDO::prepare returns false when passed invalid SQL
$handle->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
catch (Exception $e)
{
// trigger (big, orange) error
trigger_error($e->getMessage(), E_USER_ERROR);
exit;
}
}
// prepare SQL statement
$statement = $handle->prepare($sql);
if ($statement === false)
{
// trigger (big, orange) error
// trigger_error($handle->errorInfo()[2], E_USER_ERROR); need to fix array issue
exit;
}
// execute SQL statement
$results = $statement->execute($parameters);
// return result set's rows, if any
if ($results !== false)
{
return $statement->fetchAll(PDO::FETCH_ASSOC);
}
else
{
return false;
}
}
答案 0 :(得分:0)
您似乎无法再使用NULLS进行更新
答案 1 :(得分:-1)
当您正在更新行时,您无法使用 fetch 方法。这就是为什么它只能使用选择查询。
With PDO, how can I make sure that an UPDATE statement was successful?
您必须使用 rowCount 方法查看受查询影响的数量。顺便说一句,我认为尝试仅在一种方法中混合使用不同的查询类型是一个好主意。 选择,更新,插入或删除的返回值不相同。你不能在同一个函数中总结这些。
如果要集中数据库连接,我邀请您创建一个PDO子类,您可以在其中对数据库凭据进行硬编码。或者您可以创建一个全局PDO对象或更好,使用单例。这样,您就可以在任何地方使用您的PDO实例,而无需复制您的数据库凭据并使用PDO本机方法进行准备。