0

如果给定的类型在我的情况下似乎没有意义,我在理解绑定 PDO 和 mysqli 中某些变量类型的部分含义时遇到问题。在以下代码中,类型绑定(如is)被忽略。数据库中的表行“wert_sortierung”是 INT(11)。不管是否$val_int真的是整数,如果我通过i, s/ PDO::PARAM_INTor绑定它_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();

?>

请任何人指出我的推理错误。

4

1 回答 1

0

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

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

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

而准备好的声明只是遵循这种行为。

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

SELECT wert_langtext FROM TB_wert WHERE wert_sortierung = 1; 

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

因此,作为一般建议,我建议始终默认使用“s”。唯一的缺点是 PDO 的模拟准备,它可以很容易地解决。

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

于 2013-08-14T15:56:45.683 回答