MySQL到WPDB查询转换的帮助

时间:2012-01-12 作者:Matt

我有个问题。我有一个跟踪单个文件下载的PHP脚本,我正在寻找一种在单个帖子中显示该数字的方法。我有一个半生不熟的解决方案——一个简单的ol\'MySQL手动连接脚本,但我正在尝试将其转换为Wordpress插件(我希望它使用WPDB)。I\'ve tried to convert it, but I don\'t know what the Wordpress alternative to \'mysql_fetch_array.\' 无论如何,我已经在下面加入了原始脚本,以及我在Wordpress友好版本上的进展。

普通版本:

function mb_download_count() {
    global $post;
    if (get_post_meta($post->ID, \'zipname\', TRUE)) {
        $namemeta = get_post_meta($post->ID, \'zipname\', TRUE);

        require $_SERVER[\'DOCUMENT_ROOT\'].\'/downloader-connect.php\';
        $result = mysql_query("SELECT * FROM mb_download_manager
                                    WHERE filename=\'".$namemeta.".zip\'");  

            // get the first (and hopefully only) entry from the result
        $row = mysql_fetch_array( $result );
            // Print out the contents of each row into a table 
        if ($row[\'downloads\'] == \'\') { echo (\'0\'); } else {
        echo $row[\'downloads\']; }
        } else { }
}
迄今为止,Wordpress友好版本:

function mb_download_count() {
    global $wpdb;
    global $post;
    if (get_post_meta($post->ID, \'zipname\', TRUE)) {
        $namemeta = get_post_meta($post->ID, \'zipname\', TRUE);

        $result = $wpdb->query("SELECT * FROM mb_download_manager
                                    WHERE filename=\'".$namemeta.".zip\'");  

        $row = mysql_fetch_array( $result );
        if ($row[\'downloads\'] == \'\') { echo (\'0\'); } else {
        echo $row[\'downloads\']; }
        } else { }
}

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

而不是使用$wpdb->query(), 使用$wpdb->get_results(). 此方法允许您指定返回类型,以便将查询作为关联数组返回。例如

$results = $wpdb->get_results(
    "SELECT * FROM mb_download_manager
     WHERE filename=\'" . $namemeta . ".zip\'",
    ARRAY_A
);
这将返回关联数组的索引数组。。。因此,您可以反复查看结果:

foreach( $results as $row ) {
    if ( $row[\'downloads\'] == \'\') // ... and so on
如果卡住,请再次检查Codex documentation.

编辑1/13如果要将所有下载内容相加,需要做两件事:

保持一个连续的总数,正确地将变量转换为数字foreach 循环,声明下载计数器:

$counter = 0;
foreach( $results as $row ) {
    // etc ...
此变量将保存您的下载总数。

接下来,您需要将下载次数添加到计数器:

$counter = 0;
foreach( $results as $row ) {
    $counter += intval( $row[\'downloads\'] );
    // etc ...
Theintval() 函数将接收一个混合变量并返回其整数值。所以字符串"0" 成为整数0. 这允许您实际添加结果,而不是串联字符串(例如,"1" + "2" = "12" 但是1 + 2 = 3).

SO网友:MathSmath

由于您只需要一列中的一个值,因此可以使用get\\u var方法而不是query方法——这样,您就不需要循环任何结果(结果是字符串)。因此,在您的情况下,您可以执行以下操作:

$downloads = $wpdb->get_var($wpdb->prepare("SELECT downloads FROM mb_download_manager WHERE filename=%s", $namemeta.".zip"));
然后,您可以只回显结果:

echo $downloads;
请参见wpdb codex page, 根据您的情况,它还有一长串可以使用的其他wpdb方法。其中一些方法(如insert方法)比编写直接SQL更容易使用。

哦,还要注意准备方法的使用,这有助于防止注射和垃圾。这不是必需的,但这是很好的做法。还请注意,此表需要位于WordPress数据库中。

SO网友:Ricky Boyce
foreach( $results as $row ) {
    if ( $row[\'downloads\'] == \'\')

Change to. .

foreach( $results as $row ) {
    if ( $row->downloads == \'\') // ..
结束

相关推荐

$wpdb->flush();中断循环

我正在使用$wpdb->flush(); 在我的页面底部,试图防止由于缓存而多次执行查询,但它似乎不是刷新最近的查询,而是刷新整个缓存,因为我的页面没有加载过去生成的内容。可能相关信息:我正在使用exec-php 插件,因此此页面完全是php,我还有另一个可能相关的问题as detailed here