2014-07-19 2 views
1

현재 데이터베이스에 새 페이지를 추가하고 동시에 탐색 테이블을 업데이트하는 단일 함수를 PHP 스크립트에 작성하려고합니다. 어떤 이유로 두 쿼리가 모두 실패하고, 내가 무엇을해야하는지 잘 모르겠습니다. 이 내 add_content 함수 호출입니다 :함수를 사용하여 mysql에 2 개의 쿼리를 삽입하십시오.

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
$query2 = "INSERT INTO `navigation` ('page', 'content_id') 
SELECT :page, c.content_id FROM content c WHERE title=:page;"; 
    ^column name marker 

당신은 열 이름에 대한 마커를 사용할 수 없습니다. docs

마커는 SQL 문의 특정 위치에서만 유효합니다. 예제의 경우 WHERE 절의 열과의 비교에서 비교 값을 지정하기 위해 INSERT 문의 VALUES() 목록에 허용됩니다 (행에 대해 열 값 지정). 그러나 식별자 (예 : 테이블 또는 열 이름)에 대해 (SELECT 문에서 반환 할 열의 이름을 지정하는 목록) 또는 (이진 연산자의 피연산자 = equal 표지판. 매개 변수 유형을 결정할 수 없기 때문에 이 될 수 있으므로 후자의 제한이 필요합니다. 일반적으로 매개 변수는 이며 DML (Data Manipulation Language) 문에서만 유효하며 DDL (데이터 정의 언어) 문에는 사용할 수 없습니다. 이 $page 동일 할 것입니다 귀하의 경우 조건을 보장하기 때문에

당신이 일정 $page을 선택하려는 경우 선택할 수있는 c.title.

$query2 = "INSERT INTO `navigation` ('page', 'content_id') 
SELECT c.title, c.content_id FROM content c WHERE title=:page;"; 

또한, 당신은 감각을 만드는,

$stmt->bindParam(':page', $page); 
^
+0

아에 잘못된 문

$stat->bindParam(':page', $page); 

변경이에 $page을 결합하고 있습니다. 그 대신에 내가 사용해야 할 것에 대한 제안이 있습니까? 나는 따옴표로 테스트했기 때문에 여전히 작동하지 않습니다. 편집 : NEvermind, 난 그냥 나머지 보았다. 나는 그것을 시도 할 것이다. – Jess

+0

@ Jess는'c.title'은'$ page'와 동일하므로'c.title'을 삽입하면 같은 결과를 얻을 수 있습니다. 하지만'content.page'가 아닌'$ page'의 값을 원합니까? (이 경우': page'를'c.page'로 바꾸면됩니다)? – FuzzyTree

+0

navigation.page에서 값이 필요합니다. 왜냐하면 content.page가 전혀 없기 때문입니다. 내 테이블은 콘텐츠 (content_id, title, content) 및 탐색 (nav_id, page, content_id)으로 설정됩니다. 내 nav의 콘텐츠 ID는 외래 키이므로 두 번째 내비게이션 쿼리를 실행하여 페이지를 사용하여 content_id를 추출합니다./title 값은 정확하게 같아야합니다. 그러나 그것은 작동하지 않는 것 같습니다. – Jess

관련 문제