在 MySQL 'COOPERATIVE' LOCK 查询中使用占位符

Using placeholders in MySQL 'COOPERATIVE' LOCK queries

我以前在MySQL成功使用过所谓的合作LOCK。我的 PHP 代码中有自定义函数,用于获取锁、释放锁和检查锁是否有效。例如,要锁定,我做了类似的事情:

//code
"SELECT GET_LOCK( 'unique_string', -1 ) AS acquired"
// code
return ( $row['acquired'] == 1);

为了解锁,我做了类似的事情:

// code
"SELECT RELEASE_LOCK( 'unique_string' ) AS released"
// code
return ( $row['released'] == 1 );

最后,为了检查锁定是否有效,我做了:

//code
"SELECT IS_USED_LOCK( 'unique_string' ) AS connection_id"
//code
return ( NULL != $row['connection_id'] );

在所有这些情况下,我都使用了 PDO::query() 方法(即没有准备好的语句),因为我的 SELECT 语句不包含任何参数

现在,需要将用户的输入连接到 unique_string。有没有办法让 unique_string 包含占位符以便使用 PDO::prepare() 并避免可能的 SQL 注入攻击?

谢谢。

使用prepared statement应该没有问题,直接用

$statement = PDO::prepare("SELECT GET_LOCK( ?, -1 ) AS acquired");
$statement->execute([$uniqueString]);

您也可以使用命名参数,建议查看 PDO 的准备语句文档。