PHP和MySQL使用命名参数,对吗?
我使用$\u POST将变量传递到脚本中。然后使用这些变量来塑造sql查询。我尝试使用命名参数,但是,虽然它可以工作,但我不确定冒号部分在我的示例中是如何工作的。我想我理解bindValue()部分,只是不理解它是如何集成/连接到SQL的。我觉得我的查询是不完整的,即使它似乎工作正常。如有任何解释或指导,我们将不胜感激PHP和MySQL使用命名参数,对吗?,php,mysql,sql,Php,Mysql,Sql,我使用$\u POST将变量传递到脚本中。然后使用这些变量来塑造sql查询。我尝试使用命名参数,但是,虽然它可以工作,但我不确定冒号部分在我的示例中是如何工作的。我想我理解bindValue()部分,只是不理解它是如何集成/连接到SQL的。我觉得我的查询是不完整的,即使它似乎工作正常。如有任何解释或指导,我们将不胜感激 $answerNumber = $_POST['answerNumber']; $questionNumber = $_POST['questionNumber']; $answ
$answerNumber = $_POST['answerNumber'];
$questionNumber = $_POST['questionNumber'];
$answerText = $_POST['answerText'];
try {
//INSERT QUERY
$sql = "INSERT INTO $questionNumber ($answerNumber) VALUES ('$answerText')";
$stmt = $db->prepare($sql);
$stmt->bindValue(':questionNumber', '%' . $questionNumber . '%');
$stmt->bindValue(':answerNumber', '%' . $answerNumber . '%');
$stmt->bindValue(':answerText', '%' . $answerText . '%');
$stmt->execute();
$errorInfo = $db->errorInfo();
if(isset($errorInfo[2])){
$error = $errorInfo[2];
echo $error;
} else {
echo "No errors.";
};
} catch (Exception $e) {
$error = $e->getMessage();
}
编辑:我正在查看的示例使用了SELECT not INSERT,并使用了我没有的“WHERE make LIKE:make”语句。不知道这里发生了什么。谢谢 不,你做错了。在实际的查询字符串中没有使用任何参数,而是直接将外部数据插入字符串中,这给您的查询留下了很大的空间 正确的格式是:
INSERT ... VALUES(:param1, :param2, ....., :paramN);
用于查询字符串,然后
$stmt->bindValue(':param1', $value_for_param1);
$stmt->bindValue(':param2', $value_for_param2);
etc...
另外,为什么要将%
添加到绑定值中。在SQL上下文中,%
通常用于之类的
通配符匹配,通常不会像您这样添加到插入的文本中
同样,只有当DB库(PDO?)设置为抛出异常时,使用
try/catch
才有用。这意味着你的$errorInfo
东西永远不会执行,因为execute()
或prepare()
调用会在此时抛出异常。可以使用异常,也可以使用“失败时返回false”。不是两者都有。要连接数据库:
$db = new mysqli('host', 'user', 'pass', 'database');
if($db->connect_errno > 0){
die('Unable to connect to database [' . $db->connect_error . ']');
}
也可以使用bind_param()函数:
$sql = "INSERT INTO ? (?) VALUES (?)";
$stmt = $db->prepare($sql);
$stmt->bind_param('iis', $questionNumber, $answerNumber, $answerText);
$stmt->execute();
这样,您就不会在查询中设置任何参数。。。您可以直接将变量插入到查询字符串中
INSERT INTO *table* VALUES (:param1, :param2, :param3, param4,...);
用于查询字符串,然后
$stmt->bindValue(':param1', $value_for_param1);
$stmt->bindValue(':param2', $value_for_param2);
$stmt->bindValue(':param3', $value_for_param3);
$stmt->bindValue(':param4', $value_for_param4);
谢谢Marc,这是我理解“:param1”在SQL中工作时发生的事情所需要的提示。这个SQL看起来正确吗?“插入到:questionNumber(:answerNumber)值(:answerText)“我收到一个SQL格式错误”,您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在第1行“否”的“q1”(“a1”)值(“答案2”)附近使用的正确语法。占位符仅用于值。不能使用它们来指定表或字段。e、 g.
其中foo=:bar
正常。但是where:foo=:bar
是错误的,因为它将被视为比较两个值<代码>其中“foo”=“bar”,而不是其中insertedfield=somevalue
。e、 任何sql关键字都是占位符的禁区。我明白了。所以,我现在要做的是“插入$questionNumber(:answerNumber)值(:answerText)”,但仍然有错误。“您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以了解在第1行使用“a1”)值(“答案2”)附近的正确语法”如果您的值显示在错误文本中,则您仍然在做错事。这种语法错误应该在prepare()
阶段捕获。