在 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 的准备语句文档。
我以前在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 的准备语句文档。