【问题标题】:php checking Prepared statements in if statementsphp 检查 if 语句中的准备好的语句
【发布时间】:2015-07-24 23:07:22
【问题描述】:

您好,我目前在使用准备好的语句的 php 中使用 if 语句时遇到问题,无论我在检查 get_result 时输入什么,我的语句总是正确的。老实说,我不知道我在做什么我对 php 和准备好的语句的概念非常陌生。

$searchtext= $_POST['search-box'];
$sqlName= $connect->prepare("SELECT * FROM SearchPG WHERE PGName LIKE ? ");
                $sqlName->bind_param("s", $searchtext);
                $sqlName->execute();

                $NameResult = $sqlName->get_result();

                $sqltext= $connect->prepare("SELECT * FROM SearchPG WHERE PGKeywords LIKE ? ");
                $sqltext->bind_param("s", $searchtext);
                $sqltext->execute();

                $TextResult = $sqltext->get_result();
if($NameResult->num_rows > 0 || $TextResult->num_rows > 0){
                        if($NameResult->num_rows > 0 ){
                            echo "made it into sqlname";
                            while($rs = $NameResult->fetch_assoc()){
                                echo "name result";

                                ?>
                                <div class="row resultcontent">
                                    <a href="<?php echo $rs['PGUrl'];?>">
                                        <div class="col-sm-8 searchRsltCont">
                                            <img src="<?php echo $rs['PGImgUrl'];?>" class="searchRsltimg" alt="search result image" />
                                            <div class="contshading">
                                            </div>
                                        </div>
                                        <div class="col-sm-4 searchRslttxt">
                                            <h1><?php echo "name".$rs['PGName'];?></h1>
                                        </div>
                                    </a>
                                </div>
                                <?php
                                $count++;
                            }
                        }
                        if($count<10){
                            echo "exploded result";
                            foreach($searchbit as $value){
                                $temp = '%'.$value.'%';
                                $sqlvalue= $connect->prepare("SELECT * FROM SearchPG WHERE PGName LIKE ? OR PGKeyword LIKE ? ");

                                $sqlvalue->bind_param("ss", $temp, $temp);
                                $sqlvalue->execute();
                                $ValueResult = $sqlvalue->get_result();

                                if($ValueResult->num_rows > 0){
                                    while($rs = $ValueResult->fetch_assoc()){
                                        ?>
                                        <div class="row resultcontent">
                                            <a href="<?php echo $rs['PGUrl'];?>">
                                                <div class="col-sm-8 searchRsltCont">
                                                    <img src="<?php echo $rs['PGImgUrl'];?>" class="searchRsltimg" alt="search result image" />
                                                    <div class="contshading">
                                                    </div>
                                                </div>
                                                <div class="col-sm-4 searchRslttxt">
                                                    <h1><?php echo "name".$rs['PGName'];?></h1>
                                                </div>
                                            </a>
                                        </div>
                                        <?php
                                        $count++;
                                    }
                                }
                            }
                            while($rs = $TextResult->fetch_assoc()){
                                ?>
                                <div class="row resultcontent">
                                    <a href="<?php echo $rs['PGUrl'];?>">
                                        <div class="col-sm-8 searchRsltCont">
                                            <img src="<?php echo $rs['PGImgUrl'];?>" class="searchRsltimg" alt="search result image" />
                                            <div class="contshading">
                                            </div>
                                        </div>
                                        <div class="col-sm-4 searchRslttxt">
                                            <h1><?php echo "name".$rs['PGName'];?></h1>
                                        </div>
                                    </a>
                                </div>
                                <?php
                                $count++;
                            }


                        }

我已经尝试过 if(!$result)、if($result->num_rows>0)、if($result->affected_rows) 和其他方法,但似乎都没有用,有人知道我做错了什么

【问题讨论】:

  • 抱歉,但请将“代码墙”缩短为演示问题的最小示例。没有人愿意完成所有这些工作。
  • @arkascha 很抱歉我清理了它

标签: php html search-engine


【解决方案1】:

很有可能您没有安装“本机驱动程序”(mysqlnd),这是 get_result() 方法所必需的。

参见。 http://php.net/manual/en/mysqli-stmt.get-result.php

尝试使用 PDO:

<?php

$dbh = new PDO(
  'mysql:dbname=myDatabase;host=myHost', 
  'myUsername', 'myPassword');

$stmt = $dbh->prepare('SELECT * FROM SearchPG WHERE PGName LIKE ? ');
$stmt->bindParam(1, $searchtext, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();
foreach($result as $row) {
    print_r($row);
}

【讨论】:

  • 我刚刚检查了我的 phpinfo.php 并启用了 mysqlnd,get_result 似乎也可以工作,它只是任何与之相关的 if 语句似乎总是正确的,当它们应该是错误的但仍然是正确的时候是的,就好像 if 语句根本不存在。这很奇怪。对于 PDO,您是否不需要安装某些东西,因为如果是这样,我在租用服务器时无法使用它。
  • 将结果集分配给 $TextResult 后,您能告诉我var_dump($TextResult); exit; 的结果是什么吗?
  • 当结果应该为真时,我得到这个:object(mysqli_result)#6 (5) { ["current_field"]=> int(0) ["field_count"]=> int(8) ["lengths"]=> NULL ["num_rows"]=> int(0) ["type"]=> int(0) } 如果它失败了,我不会得到任何结果。 NameResult 假设为 true 时与之前的结果相同,但假设为 false 时也得到相同的结果。
  • 那么剩下的唯一选择是 a) 没有记录匹配您的查询; b)您的绑定正在构建您不期望的查询。您是否尝试通过在每个 mysqli 调用后加上“$stmt->error”来进行调试?
  • 我刚刚尝试打印错误,但我没有收到任何报告,如果没有记录匹配我的查询,它应该不会使我的 if 语句失败,因为这是我的 if 语句试图实现的,一种检查是否查询实际上找到了任何记录,如果没有,它应该继续。
【解决方案2】:

对于任何可能是 php 新手、准备好的语句并且对我有类似问题的人,我通过在更改代码以适应 store_result 之后将 get_result 切换到 store_result 解决了我的问题,事情似乎完美无缺。这是我的新代码,它仍然需要一些修复和清理,但我希望这对有需要的人有所帮助。

$sqlname= $connect->prepare("SELECT PGID, PGName, PGUrl, PGImgUrl FROM SearchPG WHERE PGName LIKE ? ");
                $sqlname->bind_param("s", $searchtext);
                $sqlname->execute();
                $sqlname->store_result();

                $sqltext= $connect->prepare("SELECT PGID, PGName, PGUrl, PGImgUrl FROM SearchPG WHERE PGKeywords LIKE ? ");
                $sqltext->bind_param("s", $searchtext);
                $sqltext->execute();
                $sqltext->store_result();
if($sqlname->num_rows > 0 || $sqltext->num_rows > 0){
                        if($sqlname->num_rows > 0 ){
                            $sqlname->bind_result($id, $name, $url, $imgurl);

                            while($rs = $sqlname->fetch()){


                                ?>
                                <div class="row resultcontent">
                                    <a href="<?php echo $url;?>">
                                        <div class="col-sm-8 searchRsltCont">
                                            <img src="<?php echo $imgurl;?>" class="searchRsltimg" alt="search result image" />
                                            <div class="contshading">
                                            </div>
                                        </div>
                                        <div class="col-sm-4 searchRslttxt">
                                            <h1><?php echo "name".$name;?></h1>
                                        </div>
                                    </a>
                                </div>
                                <?php
                                $count++;
                            }
                        }
                        if($count<10){


                            if($words > 1){
                            foreach($searchbit as $value){

                                $temp = '%'.$value.'%';
                                $sqlvalue= $connect->prepare("SELECT PGID, PGName, PGUrl, PGImgUrl FROM SearchPG WHERE PGName LIKE ? OR PGKeywords LIKE ? ");
                                if ( false===$sqlvalue ) {
                                    die('connect failed: ' . htmlspecialchars($sqlvalue->error));
                                }
                                $sqlvalue->bind_param("ss", $temp, $temp);
                                if ( false===$sqlvalue ) {
                                    die('bind failed: ' . htmlspecialchars($sqlvalue->error));
                                }
                                $sqlvalue->execute();
                                if ( false===$sqlvaue ) {
                                    die('execute() failed: ' . htmlspecialchars($sqlvalue->error));
                                }
                                $sqlvalue->store_result();

                                //$ValueResult = $sqlvalue->get_result();

                                if($sqlvalue->num_rows > 0){
                                    $sqlvalue->bind_result($id, $name, $url, $imgurl);
                                    while($rs = $sqlvalue->fetch()){
                                        ?>
                                        <div class="row resultcontent">
                                            <a href="<?php echo $url;?>">
                                                <div class="col-sm-8 searchRsltCont">
                                                    <img src="<?php echo $imgurl;?>" class="searchRsltimg" alt="search result image" />
                                                    <div class="contshading">
                                                    </div>
                                                </div>
                                                <div class="col-sm-4 searchRslttxt">
                                                    <h1><?php echo "name".$name;?></h1>
                                                </div>
                                            </a>
                                        </div>
                                        <?php
                                        $count++;
                                    }
                                }
                            }
                            }
                            $sqltext->bind_result($id, $name, $url, $imgurl);

                            while($rs = $sqltext->fetch()){
                                echo "made it into the loop";
                                ?>
                                <div class="row resultcontent">
                                    <a href="<?php echo $url;?>">
                                        <div class="col-sm-8 searchRsltCont">
                                            <img src="<?php echo $imgurl;?>" class="searchRsltimg" alt="search result image" />
                                            <div class="contshading">
                                            </div>
                                        </div>
                                        <div class="col-sm-4 searchRslttxt">
                                            <h1><?php echo "name".$name;?></h1>
                                        </div>
                                    </a>
                                </div>
                                <?php
                                $count++;
                            }


                        }
                    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多