使用函数在mysql中插入2个查询

时间:2014-07-19 02:28:22

标签: php mysql

目前我正在尝试在我的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>

1 个答案:

答案 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);
   ^