目前我正在尝试在我的php脚本中编写一个函数,它将一个新页面添加到我的数据库中并同时更新导航表。出于某种原因,两个查询都失败了,我不确定我还应该做什么。 这是我的add_content函数调用:
elseif ($react == "add_content") {
echo 'add content';
$title = $_POST['title'];
$content = $_POST['content'];
$page = $_POST['page'];
if (!empty($title) && !empty($content) && !empty($page)) {
addcontent($title, $content, $page);
} else {
echo 'not enough info';
}
这是我的功能:
function addcontent($title, $content, $page) {
global $db;
$query1 = "INSERT INTO `content`(`title`, `content`) VALUES (:title, :content)";
$query2 = "INSERT INTO `navigation` ('page', 'content_id') SELECT :page, c.content_id FROM content c WHERE title=:page;";
try {
$stat = $db->prepare($query1);
$stmt = $db->prepare($query2);
$stat->bindParam(':title', $title);
$stat->bindParam(':content', $content);
$stat->bindParam(':page', $page);
$stat->execute($query1);
$stmt->execute($query2);
$result = "<strong>$title</strong> added<p>";
} catch (Exception $ex) {
$result = "$title deltetion failed";
}
}
我知道这两个查询有效,因为我已经使用虚拟信息对它们进行了测试,它只是让它们在导致问题的函数内部工作。
我不确定是否需要这个,但为了以防万一,这是我添加内容的表格:
<form method="POST" action="index.php">
<input type="hidden" name="react" value="add_content">
<input type="hidden" name="page|title" value="admin">
<div align="center"><center><p>ADD A New Page<br>
Title: <input type="text" name="title|page" size="20"><br>
Content: <input type="text" name="content" size="20"><br>
<input type="submit" value="Submit"></p></center></div>
</form>
答案 0 :(得分:0)
$query2 = "INSERT INTO `navigation` ('page', 'content_id')
SELECT :page, c.content_id FROM content c WHERE title=:page;";
^ column name marker
您不能将标记用于列名称。来自docs
标记仅在SQL语句的某些位置是合法的。对于 例如,它们被允许在INSERT语句的VALUES()列表中 (指定行的列值),或与列进行比较 在WHERE子句中指定比较值。但是,他们不是 在select中允许标识符(例如表名或列名) 列出要由SELECT语句返回的列的名称),或 指定二元运算符的两个操作数,例如= equal 标志。后一种限制是必要的,因为它会 无法确定参数类型。通常,参数是 仅在数据操作语言(DML)语句中合法,而不在 数据定义语言(DDL)语句。
如果您尝试选择常量$page
,则可以选择c.title
,因为您的where条件可以保证它等于$page
。
$query2 = "INSERT INTO `navigation` ('page', 'content_id')
SELECT c.title, c.content_id FROM content c WHERE title=:page;";
此外,您将$page
绑定到错误的声明
$stat->bindParam(':page', $page);
将其更改为
$stmt->bindParam(':page', $page);
^