【发布时间】:2013-08-16 14:58:21
【问题描述】:
如果给定的类型在我的情况下似乎没有意义,那么我在理解绑定 PDO 和 mysqli 中某些变量类型的部分含义时遇到了问题。在以下代码中,类型绑定(如i 或s)被忽略。数据库中的表行“wert_sortierung”是 INT(11)。不管$val_int 是否真的是整数,如果我通过i、s / 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