代码之家  ›  专栏  ›  技术社区  ›  Alec

如何回应MySQLi准备的声明?

  •  53
  • Alec  · 技术社区  · 17 年前

    我现在正在玩MySQLi,试图弄清楚这一切是如何运作的。在我目前的项目中,我总是喜欢在编码时回显查询字符串,以确保一切正确,并快速调试我的代码。但是。..我如何使用准备好的MySQLi声明来完成此操作?

    例子:

    $id = 1;
    $baz = 'something';
    
    if ($stmt = $mysqli->prepare("SELECT foo FROM bar WHERE id=? AND baz=?")) {
      $stmt->bind_param('is',$id,$baz);
      // how to preview this prepared query before acutally executing it?
      // $stmt->execute();
    }

    我一直在浏览这份名单( http://www.php.net/mysqli


    编辑

    function preparedQuery($sql,$params) {
      for ($i=0; $i<count($params); $i++) {
        $sql = preg_replace('/\?/',$params[$i],$sql,1);
      }
      return $sql;
    }
    
    $id = 1;
    $baz = 'something';
    
    $sql = "SELECT foo FROM bar WHERE id=? AND baz=?";
    
    echo preparedQuery($sql,array($id,$baz));
    
    // outputs: SELECT foo FROM bar WHERE id=1 AND baz=something
    

    显然,它远非完美,因为它仍然非常冗余——这是我想防止的——而且它也没有让我知道MySQLi对数据做了什么。但我想这样我可以很快看到所有的数据是否都存在并且在正确的位置,这会拯救我

    6 回复  |  直到 17 年前
        1
  •  12
  •   karim79    16 年前

    我认为你不能——至少不能以你希望的方式。您要么必须自己构建查询字符串并执行它(即不使用语句),要么寻找或创建一个支持该功能的包装器。我用的是 Zend_Db

    $id = 5;
    $baz = 'shazam';
    $select = $db->select()->from('bar','foo')
                           ->where('id = ?', $id)
                           ->where('baz = ?', $baz); // Zend_Db_Select will properly quote stuff for you
    print_r($select->__toString()); // prints SELECT `bar`.`foo` FROM `bar` WHERE (id = 5) AND (baz = 'shazam')
    
        2
  •  9
  •   mustbebuilt    14 年前

    我过去一直在努力解决这个问题。因此,为了解决这个问题,我编写了一个小函数,根据SQL、标志和变量为我构建SQL。

    //////////// Test Data //////////////
    $_GET['filmID'] = 232;
    $_GET['filmName'] = "Titanic";
    $_GET['filmPrice'] = 10.99;
    
    //////////// Helper Function //////////////
    function debug_bind_param(){
        $numargs = func_num_args();
        $numVars = $numargs - 2;
        $arg2 = func_get_arg(1);
        $flagsAr = str_split($arg2);
        $showAr = array();
        for($i=0;$i<$numargs;$i++){
            switch($flagsAr[$i]){
            case 's' :  $showAr[] = "'".func_get_arg($i+2)."'";
            break;
            case 'i' :  $showAr[] = func_get_arg($i+2);
            break;  
            case 'd' :  $showAr[] = func_get_arg($i+2);
            break;  
            case 'b' :  $showAr[] = "'".func_get_arg($i+2)."'";
            break;  
            }
        }
        $query = func_get_arg(0);
        $querysAr = str_split($query);
        $lengthQuery = count($querysAr);
        $j = 0;
        $display = "";
        for($i=0;$i<$lengthQuery;$i++){
            if($querysAr[$i] === '?'){
                $display .= $showAr[$j];
                $j++;   
            }else{
                $display .= $querysAr[$i];
            }
        }
        if($j != $numVars){
            $display = "Mismatch on Variables to Placeholders (?)"; 
        }
        return $display;
    }
    
    //////////// Test and echo return //////////////
    
    echo debug_bind_param("SELECT filmName FROM movies WHERE filmID = ? AND filmName = ? AND price = ?", "isd", $_GET['filmID'], $_GET['filmName'], $_GET['filmPrice']);
    

    Mysqli Prepare Statement Checker

        3
  •  5
  •   Noah Heck    9 年前


    PDO mysqli 在github上,这似乎解决了你的问题:

    https://github.com/noahheck/E_mysqli

    mysqli mysqli_stmt 类,允许您通过将绑定参数插值到准备好的查询中,然后将结果查询字符串作为新属性提供给您,来查看要在db服务器上执行的查询示例 stmt 对象:

    $mysqli  = new E_mysqli($dbHost, $dbUser, $dbPass, $dbName);
    
    $query = "UPDATE registration SET name = ?, email = ? WHERE entryId = ?";
    
    $stmt = $mysqli->prepare($query);
    
    $stmt->bindParam("ssi", $_POST['name'], $_POST['email'], $_POST['entryId']);
    
    $stmt->execute();
    
    echo $stmt->fullQuery;
    

    UPDATE registration SET name = 'Sue O\'reilly', email = 'sue.o@example.com' WHERE entryId = 5569
    

    请注意,fullQuery中的值会根据db服务器上的字符集进行适当的转义,这应该使此功能适用于日志文件、备份等。

    mysqli 扩展,这个项目是应其姊妹项目用户的要求创建的,因此非常感谢开发人员在生产中使用它提供的任何反馈。

    免责声明

        4
  •  3
  •   Langerz    17 年前

        5
  •  -1
  •   alchemist    7 年前

    我能够使用 var_dump()

      $postmeta_sql = "INSERT INTO $db_new.wp_postmeta (post_id, meta_key, meta_value) VALUES (?, ?, ?)";
      $stmt = $new_conn->prepare($postmeta_sql);
      $stmt->bind_param("sss", $post_id, $meta_key, $meta_value);
      echo var_dump($stmt);
      $stmt->execute();
      $stmt->close();
    
        6
  •  -1
  •   l00sed    5 年前

    您可以在mysql服务器上打开日志查询。 只需执行命令:

    sql> SHOW VARIABLES LIKE "general_log%";
    sql> SET GLOBAL general_log = 'ON';
    

    并查看日志文件中的查询。

    sql> SET GLOBAL general_log = 'OFF';
    
    推荐文章