Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和MySQL使用命名参数,对吗?_Php_Mysql_Sql - Fatal编程技术网

PHP和MySQL使用命名参数,对吗?

PHP和MySQL使用命名参数,对吗?,php,mysql,sql,Php,Mysql,Sql,我使用$\u POST将变量传递到脚本中。然后使用这些变量来塑造sql查询。我尝试使用命名参数,但是,虽然它可以工作,但我不确定冒号部分在我的示例中是如何工作的。我想我理解bindValue()部分,只是不理解它是如何集成/连接到SQL的。我觉得我的查询是不完整的,即使它似乎工作正常。如有任何解释或指导,我们将不胜感激 $answerNumber = $_POST['answerNumber']; $questionNumber = $_POST['questionNumber']; $answ

我使用$\u POST将变量传递到脚本中。然后使用这些变量来塑造sql查询。我尝试使用命名参数,但是,虽然它可以工作,但我不确定冒号部分在我的示例中是如何工作的。我想我理解bindValue()部分,只是不理解它是如何集成/连接到SQL的。我觉得我的查询是不完整的,即使它似乎工作正常。如有任何解释或指导,我们将不胜感激

$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()
阶段捕获。