为什么我的查询不使用PREPARE运行

时间:2015-05-16 作者:Zeeshan

您好,下面是我的查询,它与localhost上的prepare关键字一起工作,但每当我在live server上的查询中使用prepare关键字时,数据不会显示出来,我从live server上的查询中删除prepare后,查询就会工作。所以我这样做是为了从SQL注入中保存我的站点。那么,如果我做错了什么。我在实时服务器上使用prepare是否良好且安全,因为使用prepare和我下面的语法数据总是显示为空。谢谢大家。

$sqll = "SELECT Sum(votes.votes) AS votessum FROM votes WHERE votes.uid = \'$uid\' && votes.competition = \'$comp\'";

     $reel = $wpdb->get_var($wpdb->prepare($sqll)) or die(mysql_error());
        echo json_encode ($reel);
        die();

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

That is not how $wpdb->prepare works. 您输入prepare 带的字符串sprintf-如占位符和适当的替换值。

占位符

prepare的查询参数接受类似sprintf()的占位符。支持%s(字符串)、%d(整数)和%f(浮点)格式。(自从在版本2.3中将函数添加到core后,%s和%d占位符就可用,%f仅在版本3.3后可用。)除非转义,否则任何其他%字符都可能导致分析错误。SQL字符串文本中的所有%字符(包括LIKE通配符)必须以%%的形式进行双-%转义。在查询字符串中,所有%d、%f和%s都不带引号。请注意,%d占位符只接受整数,因此不能通过%d传递具有逗号值的数字。如果需要逗号值,请使用%f作为浮点。

在你的情况下,我猜是这样的:

$sqll = "SELECT Sum(votes.votes) AS votessum FROM votes WHERE votes.uid = %d && votes.competition = %s";
$reel = $wpdb->get_var($wpdb->prepare($sqll,$uid,$comp));

结束