【问题标题】:bindValue and bindParam in mysqli and PDO ignore variable typemysqli 和 PDO 中的 bindValue 和 bindParam 忽略变量类型
【发布时间】:2013-08-16 14:58:21
【问题描述】:

如果给定的类型在我的情况下似乎没有意义,那么我在理解绑定 PDO 和 mysqli 中某些变量类型的部分含义时遇到了问题。在以下代码中,类型绑定(如is)被忽略。数据库中的表行“wert_sortierung”是 INT(11)。不管$val_int 是否真的是整数,如果我通过is / PDO::PARAM_INT_STR 绑定它,查询始终有效,没有中断,没有错误或警告,即绑定和数据库或变量本身不适合。

<?
class PDOTest {
    protected $pdo;

    function __construct(){

        $usr="usr";        
        $pwd="pwd";     
        $host="localhost";    
        $db="db";
        $val_int="I'm a string";
        $val_str="OP";

        $querystring="SELECT wert_langtext FROM TB_wert WHERE wert_sortierung = ? AND wert_CD = ?";

        try {

            $db_info = "mysql:host=$host;dbname=$db";  // usually provided via require_once and during construction

            $this->pdo = new PDO($db_info, $usr, $pwd);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
            $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

            $stmt = $this->pdo->prepare($querystring);

            $stmt->bindValue(1,$val_int,PDO::PARAM_INT);
            $stmt->bindValue(2,$val_str,PDO::PARAM_STR);

            $stmt->execute(); 

            $row_return = $stmt->fetchAll(PDO::FETCH_ASSOC);
            $this->varprint($row_return);
            $this->pdo = NULL;
            }

        catch (PDOException $ex) {
            printf ('Es spricht:');
            $this->printerror("Fehla! (" .  $ex->getMessage() . ")");
            $this->pdo = NULL;
            exit();
        }

        printf("<br />-------<br />");      
        //Added for comparison
        $mysqli = new mysqli($host, $usr, $pwd, $db);

        $m_stmt = $mysqli->prepare($querystring);
        $m_stmt->bind_param('is',$val_int, $val_str);

        $m_stmt->execute();
        $m_stmt->bind_result($row_return);
        $m_stmt->fetch();

        $this->varprint($row_return);

        $m_stmt->close();
        $mysqli->close(); 

    }

    private function printerror($txt) {
            printf("<p><font color=\"#ff0000\">%s</font></p>\n",
            htmlentities($txt));  
    }

    private function varprint($var) {
        echo "<br />";
        echo "<pre>";
        echo var_dump($var);
        echo "</pre>";  
    }
}

new PDOTest();

?>

谁能指出我的推理错误。

【问题讨论】:

  • 我不知道您的具体问题是什么
  • 我认为绑定某些变量类型的优点之一是,如果这些变量类型不适合在一起,则该过程不应该工作。例如,我在 INT 行的查询中将字符串“blabla”与i 绑定 - 没有警告或发生过类似情况。
  • 不,绑定不会验证您的数据。

标签: pdo mysqli bind-variables variable-types


【解决方案1】:

实际上是Mysql的松散类型欺骗了你。

事实上,常规的Mysql查询可以接受数字值的字符串:

SELECT wert_langtext FROM TB_wert WHERE wert_sortierung = '1' AND wert_CD = '1';

whileprepared statement 紧跟此行为。

但是,相反的情况并非那么无害。用数字寻址字符串值

SELECT wert_langtext FROM TB_wert WHERE wert_sortierung = 1; 

如果wert_sortierung 是字符串类型和一些意外行为,例如匹配所有行,将导致无限数量的警告。

因此,作为一般建议,我建议始终默认使用“s”。唯一的缺点是 PDO 的模拟准备和它can be easily worked around.

因此,要明确回答您的问题 - 准备好的语句只允许与常规查询相同的行为,而不会添加任何内容。使用常规查询可以实现的一切,也可以通过准备好的语句实现。不,绑定不会验证您的数据(但它应该验证。我的班级我测试整数占位符,如果没有给出数值则抛出异常)

【讨论】:

    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 2014-07-28
    • 2023-03-28
    • 2014-05-10
    • 2013-02-15
    • 2014-08-20
    • 2012-02-04
    • 2012-05-23
    相关资源
    最近更新 更多