2014-09-27 132 views
-2

我得到這個錯誤,當我嘗試用som moviegenres更新我的數據庫。錯誤的SQL查詢php

UPDATE RM_Movie2Genre SET 

Error in executing query: 42000 Array 
(
[0] => 42000 
[1] => 1064 
[2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 

電影被保存但不與流派。任何人都可以看到這裏有什麼問題?我知道這是在UPDATE RM_Movie2Genre SET(標記爲粗體),但我看不出有什麼不對......

$output = null; 
if($save) { 
// First save information on movie 
$sql = ' 
UPDATE RM_Movie SET 
    title = ?, 
    year = ?, 
    image = ?, 
    pris = ?, 
    director = ?, 
    length = ?, 
    plot = ?, 
    imdb = ?, 
    trailer = ?, 
    filter = ? 
WHERE 
    id = ? 
'; 
$params = array($title, $year, $image, $pris, $director, $length, $plot, $imdb, $trailer, $filter, $id); 
$db->ExecuteQuery($sql, $params); 

// Then save information on genre 
foreach($genre as $val) { 
    **$db->ExecuteQuery('UPDATE RM_Movie2Genre SET', array($val));** 
} 
$output = 'Informationen sparades'; 
} 

此代碼將只能與更新/插入電影替換所有電影。我將使用我的代碼進行更新和插入。

// Get all genres and select those that should be selected 
$sql = 'SELECT * FROM RM_MovieGenre'; 
$genres = $db->ExecuteSelectQueryAndFetchAll($sql); 

$sql = 'SELECT idRM_MovieGenre AS id FROM RM_Movie2Genre WHERE idRM_Movie = ?'; 
$myGenres = $db->ExecuteSelectQueryAndFetchAll($sql, array($id), 0, PDO::FETCH_COLUMN); 

$selectOptionGenres = "<select multiple name='genre[]'>"; 
foreach($genres as $key => $val) { 
$selected = in_array($val->id, $myGenres) ? ' selected' : null; 
$selectOptionGenres .= "<option value='{$val->id}'{$selected}>{$val->name}</option>"; 
} 
$selectOptionGenres .= '</select>'; 


// Check if form was submitted 
$output = null; 
if($save) { 
// First save information on movie 
$sql = ' 
UPDATE RM_Movie SET 
    title = ?, 
    year = ?, 
    image = ?, 
    pris = ?, 
    director = ?, 
    length = ?, 
    plot = ?, 
    imdb = ?, 
    trailer = ?, 
    filter = ? 
'; 
$params = array($title, $year, $image, $pris, $director, $length, $plot, $imdb, $trailer, $filter); 
$db->ExecuteQuery($sql, $params); 

// Then save information on genre 
$query="INSERT INTO RM_Movie2Genre(idRM_Movie,idRM_MovieGenre) values($id,?)"; 

foreach($genre as $val) { 
    $val_array=array($val); 
    $db->ExecuteQuery($query, $val_array); 
} 
$output = 'Informationen sparades'; 
} 

// Select information on the movie 
$sql = 'SELECT * FROM RM_Movie WHERE id = ?'; 
$params = array($id); 
$res = $db->ExecuteSelectQueryAndFetchAll($sql, $params); 

if(isset($res[0])) { 
$movie = $res[0]; 
} 
else { 
die('Failed: There is no movie with that id'); 
} 
+0

在運行之前打印出SQL查詢。那麼你會發現什麼是錯的。如果你使用準備好的語句(看起來像),你可以使用'echo vsprintf(str_replace('?','\'%s \'',$ query),$ params)來僞造它;' – h2ooooooo 2014-09-27 17:49:41

+1

你缺少字段'SET'後名:更新RM_Movie2Genre SET FIELD_NAME = ... – Ormoz 2014-09-27 17:51:41

+0

@Ormoz我試圖用 $ db-> ExecuteQuery('UPDATE RM_Movie2Genre SET genre =(array($ val))WHERE id =?' ; ,但得到這個問題,而不是 警告:PDOStatement :: execute():SQLSTATE [HY093]:無效參數編號:沒有參數被綁定在... – 2014-09-28 14:41:57

回答

1

我想你想改變的行與價值:

$id=$params[10]; 

我認爲你有一個ID多個流派,你把它存儲在RM_Movie2Genre表。如果是這種情況,你應該使用INSERT查詢。但首先,你應該刪除舊值:

$query="DELETE FROM RM_Movie2Genre where id=?"; 

    $val_array=array($id); 
    $db->ExecuteQuery($query, $val_array); 

現在,用於插入,如果$ id爲數字使用此查詢:

$query="INSERT INTO RM_Movie2Genre(id,genre) values($id,?)"; 

否則,如果它是字符串類型的,你應該換$ ID用單引號:

$query="INSERT INTO RM_Movie2Genre(id,genre) values('$id',?)"; 

最後:

foreach($genre as $val) { 
    $val_array=array($val); 
    $db->ExecuteQuery($query, $val_array); 
} 

我不認爲UPDATE是有意義的,因爲使用更新查詢,您將多次更新單行,這是無用的。無論如何,如果你仍然認爲update查詢,那麼你應該與這一個改變$query

$query="UPDATE RM_Movie2Genre SET genre = ? WHERE id =$id"; 

,如果它是字符串類型:

$query="UPDATE RM_Movie2Genre SET genre = ? WHERE id ='$id'"; 
+0

我使用同一個文件同時更新電影和插入新電影,因此首先刪除信息並不是一個好主意。 我嘗試了您對INSERT和UPDATE的建議,但其結果是所有其他電影都會消失並取代更新/插入的電影。 Id是數字。 我已經更新了myc代碼。 – 2014-09-29 07:00:44

+0

你已經錯過了'那裏clause'查詢:?????'$ SQL =' UPDATE RM_Movie SET 標題=, 年=, 形象=, PRIS =, 主任=, 長度=? , plot =?, imdb =?, trailer =?, filter =? ' ';'。它明顯更新所有記錄! – Ormoz 2014-09-29 08:10:11

+0

你不能更新和插入電影在一個單一的文件,並在同一時間使用刪除查詢來更新流派。事實上,這種方法是更新流派的最簡單方法。使用更新查詢更新流派需要更復雜的編碼。你不能只用一個更新查詢更新流派。所以,最好堅持刪除和更新流派。 (注意,你正在刪除流派,而不是電影本身) – Ormoz 2014-09-29 11:48:28

0

此代碼的工作只是罰款,既創建和編輯。謝謝你讓我到達那裏! :-)

// Get all genres and select those that should be selected 
$sql = 'SELECT * FROM RM_MovieGenre'; 
$genres = $db->ExecuteSelectQueryAndFetchAll($sql); 

$sql = 'SELECT idRM_MovieGenre AS id FROM RM_Movie2Genre WHERE idRM_Movie = ?'; 
$myGenres = $db->ExecuteSelectQueryAndFetchAll($sql, array($id), 0, PDO::FETCH_COLUMN); 

$selectOptionGenres = "<select multiple name='genre[]'>"; 
foreach($genres as $key => $val) { 
    $selected = in_array($val->id, $myGenres) ? ' selected' : null; 
    $selectOptionGenres .= "<option value='{$val->id}'{$selected}>{$val->name}</option>"; 
} 
$selectOptionGenres .= '</select>'; 


// Check if form was submitted 
$output = null; 
if($save) { 
    // First save information on movie 
    $sql = ' 
    UPDATE RM_Movie SET 
     title = ?, 
     year = ?, 
     image = ?, 
     pris = ?, 
     director = ?, 
     length = ?, 
     plot = ?, 
     imdb = ?, 
     trailer = ?, 
     filter = ? 
    WHERE 
     id = ? 
    '; 
    $params = array($title, $year, $image, $pris, $director, $length, $plot, $imdb, $trailer, $filter, $id); 
    $db->ExecuteQuery($sql, $params); 

    // Then save information on genre 
    $query="INSERT INTO RM_Movie2Genre(idRM_Movie,idRM_MovieGenre) values($id,?)"; 

    foreach($genre as $val) { 
     $val_array=array($val); 
     $db->ExecuteQuery($query, $val_array); 
    } 
    $output = 'Informationen sparades'; 
} 

// Select information on the movie 
$sql = 'SELECT * FROM RM_Movie WHERE id = ?'; 
$params = array($id); 
$res = $db->ExecuteSelectQueryAndFetchAll($sql, $params); 

if(isset($res[0])) { 
    $movie = $res[0]; 
} 
else { 
    die('Failed: There is no movie with that id'); 
}