这个问题让我感到非常难过,我已经查看了有关堆栈溢出的其他已回答的问题,但没有人回答我的问题。
**
**
function inputVCA(){
global $dbh;
$count = 0;
if(isset($_POST['vca'])){
$pcid = mysql_real_escape_string($_POST['ID']);
$vca = $_POST['vca'];
$tok = strtok($vca, ";");
while($tok !== false){
$countNew = countDataToHour($count);
$stmt = $dbh->prepare("UPDATE $pcid SET $countNew = :token WHERE ID='1'");
$stmt -> bindParam(':token', $tok);
echo "<br>".$pcid."<br>";
echo countDataToHour($count)."<br>";
echo $tok."<br>";
if($stmt->execute()){
// do nothing
}else{
die("failed to execute query");
}
$count++;
$tok = strtok(";");
}
}
}
**
**
888 00:00 40
警告:PDOStatement :: execute():SQLSTATE [HY093]:参数号无效:绑定变量数与第170行中C:\ xampp \ htdocs \ practice \ src \ dataChecker.php中的标记数不匹配 无法执行查询
**
**
这个问题让我如此困难的原因是因为当我测试变量等时,一切似乎都正确输出。无论如何:
**
**
我不确定的程序中的一点是:
WHERE ID='1'
在我的SQL查询中。我这样做的原因是因为我现在只需要在sql表中使用一行。
任何帮助表示赞赏,谢谢:)。同样作为旁注,任何投票给我的人都不应该有权投票给任何人。我非常清楚地表达了我的问题。我的PHP代码有点粗略,但如果你因为这个原因投票给我,这会产生反作用,可能会阻止新用户在这个网站上发布问题。如果新用户不来,那么将输给其他竞争对手。感谢所有提供有益贡献的人。
答案 0 :(得分:1)
首先,PDO和mysql_
,这两个API不会混合在一起。
删除mysql_real_escape_string
。
删除此$count = ':token'
周围的引号,读为$count = :token
(占位符不能包含引号)。
你必须在更新中围绕$pcid
添加反引号,并在我的评论和答案中结合我的其他建议。
$pcid = $_POST['ID'];
...
$stmt = $dbh->prepare("UPDATE `$pcid` SET `$countNew` = :token WHERE ID='1'");
...
根据您的评论,这是错误消息:
MySQL服务器版本,在'888 SET 00:00 ='附近使用正确的语法:'第1行'''''''''''''''''
看看错误告诉你的是什么,near '888
并且那些错误不会就此止步。
表名不能以数字开头或由数字组成。
根据文件:
标识符可以以数字开头,但除非引用可能不仅仅由数字组成。
答案 1 :(得分:0)
占位符只能在查询中表示 VALUES 。从不使用字段/表名或其他SQL关键字。
UPDATE :pcid SET :count = ':token' WHERE ID='1'
^^^^^--field ^^^^^^--value
^^^^^--field
如果要动态插入表/字段名称,则必须使用旧的sql-injection易受攻击的技术,如
$table = $source_of_pcid
$field = $source_of_count
$sql = "UPDATE $table SET $field = :token";