PDO - SQL 在没有任何警告的情况下无法工作 [重复]
Posted
技术标签:
【中文标题】PDO - SQL 在没有任何警告的情况下无法工作 [重复]【英文标题】:PDO - SQL not working without any warning [duplicate] 【发布时间】:2016-06-16 15:17:25 【问题描述】:我编写了一个函数来在任何数据库中插入我想要的内容:
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:我省略了“日期”,但它不应该制造麻烦。我用它测试了同样的东西,它做了同样的事情:什么都没有。
【问题讨论】:
$stmt->execute;
是错字吧?
日期字段中不允许有 Null。你试图把什么放在那里?什么价值?
phpMyAdmin 如果您什么都不放,请在该字段中填写一些内容。
在这种情况下您使用的是 PDO,我敢打赌它会尝试将 NULL / nothing 添加到导致它失败的字段,因为字段不允许包含 NULL 或什么都没有
即使是假日期 -> "2016-03-03 00:00:00" 也不起作用。
【参考方案1】:
尝试在异常模式下运行 PDO,然后可以捕获 PDO 异常:
$db_pdo = new PDO($db_dsn, $dbuser, $dbpassword);
$db_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// its function
$stmt->execute();
同时在 PHP 中打开错误报告以查看发生了什么
【讨论】:
感谢您的回答。不幸的是,它什么也没做:/ 用 pdo 语句尝试 catch (PDOException $e) .. do NOT try catch (PDOException $e) .. with pdo statements【参考方案2】:将 bindparam 替换为 bindvalue,因为您正在传递该数组的值: 编辑 您还有表名和列名的引号,我用反引号替换了它们,而且您缺少用于执行的括号
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.";
【讨论】:
bindValue() 类型我猜 也不工作:/。我不明白你为什么要放“'。和。”'所以我只更改了绑定值。 @Madz 使用此选项的回声编辑您的问题。 @Madz 我会在我的机器上测试它,等等 非常感谢,您的代码正在运行!引号是 '' 还是 "" ?抱歉,我不知道 '' 和 "" 的英文。以上是关于PDO - SQL 在没有任何警告的情况下无法工作 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 PDO 或 PHP 应用程序绑定的情况下解决二阶 SQL 注入
警告:PDO::__construct(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)