gpt4 book ai didi

php - 为什么我的 PDO 语句 -> 执行返回 false?

转载 作者:可可西里 更新时间:2023-11-01 00:16:46 26 4
gpt4 key购买 nike

在对它的不同方面进行了近乎无穷无尽的测试之后,我确定 PDO 连接有效(我可以运行一个简单的查询并显示结果),我确定该语句已成功准备,并且值正确绑定(bind)。由于某种原因,该语句不会执行。为了可爱起见,我试过删除所有绑定(bind)变量并执行静态查询,但这也行不通。

代码:

$dbh = new PDO( "mysql:host=localhost;dbname=".$GLOBALS['data_name'], $GLOBALS['data_user'], $GLOBALS['data_pass'] );
$dbh->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

$sth = $dbh->prepare( "SELECT * FROM :table WHERE :field = :value" );
if( $sth != false ) TCDebug( 'prepared' );
if( $sth->bindValue( ":table", $table ) ) TCDebug( "table true" );
if( $sth->bindValue( ":field", $field ) ) TCDebug( "field true" );
if( $sth->bindValue( ":value", $value ) ) TCDebug( "value true" );
$flag = $sth->execute();

if( $flag === true ) {
TCDebug( 'flag = true' );
} else if( $flag === false ) {
TCDebug( 'flag = false' );
}
$result = $sth->fetchAll();

foreach( $result as $c ) TCDebugArr( $c );
TCDebug( count( $result ) );
if( count( $result ) > 0 ) {
return $result;
} else {
return null;
}

始终回显 'prepared' 'table true' 'field true' 'value true' 'flag = false' 的调试文本,它告诉我准备和绑定(bind)工作,但执行没有,$result 为空并且函数返回空值。

我可能忽略了一些非常明显的事情,我已经做好了完全羞愧地低下头的准备。提前谢谢你...

更新

啊,串联——我今天的 friend 。工作代码如下:

$dbh = new PDO( "mysql:host=localhost;dbname=".$GLOBALS['data_name'], $GLOBALS['data_user'], $GLOBALS['data_pass'] );
$dbh->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

$prepare_str = "SELECT * FROM ". $table ." WHERE ". $field ." = :value";

$sth = $dbh->prepare( $prepare_str );
if( $sth != false ) TCDebug( 'prepared' );
if( $sth->bindValue( ":value", $value ) ) TCDebug( "value true" );
$flag = $sth->execute();

if( $flag === true ) {
TCDebug( 'flag = true' );
} else if( $flag === false ) {
TCDebug( 'flag = false' );
}
$result = $sth->fetchAll();

foreach( $result as $c ) TCDebugArr( $c );
TCDebug( count( $result ) );
if( count( $result ) > 0 ) {
return $result;
} else {
return null;
}

在这种情况下这是安全的,因为 $table$field 是系统生成的,无法通过用户输入访问;只有 $value 被公开。

谢谢 StackOverflow!你是我的最爱! :)

最佳答案

当您有一个如下所示的参数化查询时:

SELECT * FROM :table WHERE :field = :value

并且您将值替换为 :table:field:value,您会得到一些相似到以下(实际上这是一个过于简单化但说明了这一点):

SELECT * FROM 'sometable' WHERE 'somefield' = 'somevalue'

因为 :table:field 得到与 :value 相同的语义处理,即。它们被视为字符串。您通常不能使用参数化查询来参数化表名和列名。您将不得不重新考虑一下您的方法。您可能会考虑动态构建准备好的语句字符串,以便查询的表名和列名部分是简单的连接,而不是将它们与 PDO 绑定(bind)。但是您必须非常小心地验证/清理表名和列名,因为 PDO 不会在该级别保护您免受 SQL 注入(inject)。

关于php - 为什么我的 PDO 语句 -> 执行返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6420176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com