PDO - > bindParam()不会将变量绑定到PDO - > prepare()声明

时间:2015-10-17 18:05:25

标签: php mysql pdo

我正在尝试为mySQL数据库的单个表构建一个小型搜索工具。 可悲的是,我无法将我的函数参数绑定到我的sql语句,我无法弄清楚原因。

这就是我认为它的工作原理。(也许你可以在我的一般方法中发现错误)

  1. 首先,参数($ field)通过在文件底部的函数调用中引用它来传递给函数。
  2. 我在$ dbh-> prepare()语句中引用了$ field(:field)的参数键。
  3. 使用$ query-> bindParam()
  4. 将变量$ field绑定为参数
  5. 正在执行查询
  6. $ field用于从修改后的查询中提取标题。
  7. 我已经发现问题只发生在我尝试将参数绑定到语句时。所以介于步骤2-4之间。

    每当我将$ field作为纯字符串插入(作为步骤2 + 5中的“title”)时,每个事情都可以正常工作。但那不是很动态,因此我不能使用函数参数。

    那里有人可以给我一个提示:)? 我感谢任何帮助。

    <?php
    // establish connection to database
    $dbh = new PDO($server, $user, $pass);
    
    /* function takes PDO object and a string that defines the column of our table that is supposed to be returned */
    function searchField($dbh,$field){
    
        if(isset($_POST['searchbar'])){
    
            $searchInput = $_POST['searchbar'];
            $searchInput = "%" . $searchInput . "%";
            // (2)
            $query = $dbh->prepare('SELECT * FROM docs WHERE :field LIKE :searchInput');
            // (3)
            $query->bindParam(':field',$field);
            $query->bindParam(':searchInput',$searchInput);
            // (4)            
            $query->execute();
    
            foreach ($query as $doc){
                // (5)
                return $doc[$field];
    
            }
    
    
    
    
        }
    
    }
    

    &GT;

    <form action="index.php" method="post" class="search-form">
        <div class="searchbar-container">
           <input class="searchbar" name="searchbar" placeholder="Enter a filename..."></input>
           <button class="btn btn-default search-button " type="submit"><span class="glyphicon glyphicon-search submit-search" aria-hidden="true"></span></button>
        </div>
    </form>
    
    
    <div class="result-title-container">
        <?php
    
            // (1) ==== The function call ==== 
    
            echo "<h4>" . searchField($dbh,"title") . "</h4>";
        ?>
    </div>
    

1 个答案:

答案 0 :(得分:1)

bindParam只能绑定,而不能绑定对象名称(在您的情况下为列)或语法元素。如果要在like运算符之前动态设置列的名称,则必须采用字符串操作:

$query = $dbh->prepare('SELECT * FROM docs WHERE $field LIKE :searchInput');
$query->bindParam(':searchInput',$searchInput);
$query->execute();