PDO - SQL 在没有任何警告的情况下无法工作
PDO - SQL not working without any warning
我写了一个函数来在任何数据库中插入我想要的东西:
public function insert($db, $array_label, $array_value){
$DB = new PDO('mysql:host='.$_SESSION['mysql'][0].';dbname='.$_SESSION['mysql'][1].';charset=utf8', $_SESSION['mysql'][2], $_SESSION['mysql'][3]);
$sql = "INSERT INTO '".$db."' (";
for($i = 0; $i < count($array_label); $i++){
if($i > 0)
$sql .= ", ";
$sql .= "'".$array_label[$i]."'";
}
$sql .= ") VALUES (";
for($i = 0; $i < count($array_label); $i++){
if($i > 0)
$sql .= ", ";
$sql .= ":".$array_label[$i];
}
$sql .= ")";
$stmt = $DB->prepare($sql);
echo '$DB->prepare("'.$sql.'");';//DEBUG
for($i = 0; $i < count($array_label); $i++){
$label = ":".$array_label[$i];
$stmt->bindParam("$label", $array_value[$i]);
echo '</br>$stmt->bindValue("'.$label.'", '.$array_value[$i].')';//DEBUG
}
$stmt->execute;
echo "</br></br>Requête OK.";
}
}
然后,我这样使用它:
$array_label = array('ID', 'ID_lang', 'ID_entry_cat', 'date', 'label', 'content');
$array_value = array($ID, $ID_lang, $ID_entry_cat, "2016-03-03 00:00:00", $label, $content);
$DB->insert('entry', $array_label, $array_value);
经过大量测试,它可能有语法问题,但我无法弄清楚在哪里。
这是我从 echo's(//DEBUG) 得到的:
$DB->prepare("INSERT INTO 'entry' ('ID', 'ID_lang', 'ID_entry_cat', 'date', 'label', 'content') VALUES (:ID, :ID_lang, :ID_entry_cat, :date, :label, :content)");
$stmt->bindValue(":ID", 1)
$stmt->bindValue(":ID_lang", 1)
$stmt->bindValue(":ID_entry_cat", 1)
$stmt->bindValue(":date", 2016-03-03 00:00:00)
$stmt->bindValue(":label", dsqfsdq)
$stmt->bindValue(":content", sdqfdsqf)
我知道有很多关于 PDO 的主题没有返回错误但是:
在阅读了很多之后,它根本没有帮助我。
这么说吧:我是 PDO 的完全菜鸟。
我给你看的回声就是我的函数在做什么。
我附上了我的数据库的一些图片以提供帮助:
PS:我遗漏了 "date" 但它不应该制造麻烦。我用它测试了同样的东西,它做了同样的事情:什么都没有。
在异常模式下尝试运行 PDO,然后你可以捕获PDO异常:
$db_pdo = new PDO($db_dsn, $dbuser, $dbpassword);
$db_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// its function
$stmt->execute();
同时在 PHP 中打开错误报告以查看发生了什么
将 bindparam 替换为 bindvalue,因为您正在传递该数组的值:
编辑
你也有 table 和列名的引号,我用反引号替换了它们,而且你缺少 execute
的括号
function insert($db, $array_label, $array_value){
$DB = new PDO('mysql:host='.$_SESSION['mysql'][0].';dbname='.$_SESSION['mysql'][1].';charset=utf8', $_SESSION['mysql'][2], $_SESSION['mysql'][3]);
$sql = "INSERT INTO `".$db."` (";
for($i = 0; $i < count($array_label); $i++){
if($i > 0)
$sql .= ", ";
$sql .= "`".$array_label[$i]."`";
}
$sql .= ") VALUES (";
for($i = 0; $i < count($array_label); $i++){
if($i > 0)
$sql .= ", ";
$sql .= ":".$array_label[$i];
}
$sql .= ")";
$stmt = $DB->prepare($sql);
echo '$DB->prepare("'.$sql.'");';//DEBUG
for($i = 0; $i < count($array_label); $i++){
$label = ":".$array_label[$i];
$stmt->bindValue("$label", "$array_value[$i]");
echo '</br>$stmt->bindValue("'.$label.'", "'.$array_value[$i].'")';//DEBUG
}
$stmt->execute();
echo "</br></br>Requête OK.";
}
我写了一个函数来在任何数据库中插入我想要的东西:
public function insert($db, $array_label, $array_value){
$DB = new PDO('mysql:host='.$_SESSION['mysql'][0].';dbname='.$_SESSION['mysql'][1].';charset=utf8', $_SESSION['mysql'][2], $_SESSION['mysql'][3]);
$sql = "INSERT INTO '".$db."' (";
for($i = 0; $i < count($array_label); $i++){
if($i > 0)
$sql .= ", ";
$sql .= "'".$array_label[$i]."'";
}
$sql .= ") VALUES (";
for($i = 0; $i < count($array_label); $i++){
if($i > 0)
$sql .= ", ";
$sql .= ":".$array_label[$i];
}
$sql .= ")";
$stmt = $DB->prepare($sql);
echo '$DB->prepare("'.$sql.'");';//DEBUG
for($i = 0; $i < count($array_label); $i++){
$label = ":".$array_label[$i];
$stmt->bindParam("$label", $array_value[$i]);
echo '</br>$stmt->bindValue("'.$label.'", '.$array_value[$i].')';//DEBUG
}
$stmt->execute;
echo "</br></br>Requête OK.";
}
}
然后,我这样使用它:
$array_label = array('ID', 'ID_lang', 'ID_entry_cat', 'date', 'label', 'content');
$array_value = array($ID, $ID_lang, $ID_entry_cat, "2016-03-03 00:00:00", $label, $content);
$DB->insert('entry', $array_label, $array_value);
经过大量测试,它可能有语法问题,但我无法弄清楚在哪里。
这是我从 echo's(//DEBUG) 得到的:
$DB->prepare("INSERT INTO 'entry' ('ID', 'ID_lang', 'ID_entry_cat', 'date', 'label', 'content') VALUES (:ID, :ID_lang, :ID_entry_cat, :date, :label, :content)");
$stmt->bindValue(":ID", 1)
$stmt->bindValue(":ID_lang", 1)
$stmt->bindValue(":ID_entry_cat", 1)
$stmt->bindValue(":date", 2016-03-03 00:00:00)
$stmt->bindValue(":label", dsqfsdq)
$stmt->bindValue(":content", sdqfdsqf)
我知道有很多关于 PDO 的主题没有返回错误但是: 在阅读了很多之后,它根本没有帮助我。 这么说吧:我是 PDO 的完全菜鸟。
我给你看的回声就是我的函数在做什么。
我附上了我的数据库的一些图片以提供帮助:
PS:我遗漏了 "date" 但它不应该制造麻烦。我用它测试了同样的东西,它做了同样的事情:什么都没有。
在异常模式下尝试运行 PDO,然后你可以捕获PDO异常:
$db_pdo = new PDO($db_dsn, $dbuser, $dbpassword);
$db_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// its function
$stmt->execute();
同时在 PHP 中打开错误报告以查看发生了什么
将 bindparam 替换为 bindvalue,因为您正在传递该数组的值: 编辑 你也有 table 和列名的引号,我用反引号替换了它们,而且你缺少 execute
的括号 function insert($db, $array_label, $array_value){
$DB = new PDO('mysql:host='.$_SESSION['mysql'][0].';dbname='.$_SESSION['mysql'][1].';charset=utf8', $_SESSION['mysql'][2], $_SESSION['mysql'][3]);
$sql = "INSERT INTO `".$db."` (";
for($i = 0; $i < count($array_label); $i++){
if($i > 0)
$sql .= ", ";
$sql .= "`".$array_label[$i]."`";
}
$sql .= ") VALUES (";
for($i = 0; $i < count($array_label); $i++){
if($i > 0)
$sql .= ", ";
$sql .= ":".$array_label[$i];
}
$sql .= ")";
$stmt = $DB->prepare($sql);
echo '$DB->prepare("'.$sql.'");';//DEBUG
for($i = 0; $i < count($array_label); $i++){
$label = ":".$array_label[$i];
$stmt->bindValue("$label", "$array_value[$i]");
echo '</br>$stmt->bindValue("'.$label.'", "'.$array_value[$i].'")';//DEBUG
}
$stmt->execute();
echo "</br></br>Requête OK.";
}