2012-03-30 50 views
1

我試圖在數據庫中插入一個值,但是當我打開數據庫時,表中沒有插入值。現在所有的代碼都是正確的,沒有拼寫錯誤或類似的東西,但爲什麼它不是在數據庫表中插入一個值?它沒有在數據庫中插入一個值

我只是說這個字段不是主鍵字段,我只是測試這個字段,它是一個非主鍵字段,如果主鍵值不是在數據庫表中插入一個值插入?

下面是代碼:

<?php 
    session_start(); 

    $username="xxx"; 
    $password="xxx"; 
    $database="mobile_app"; 

    mysql_connect('localhost',$username,$password); 

    @mysql_select_db($database) or die("Unable to select database"); 


    $sql="INSERT INTO Session (Course) 
    VALUES 
    ('$_POST[course]')"; 

    mysql_close(); 

    if (isset($_POST['course'])) { 

    $_SESSION['course'] = $_POST['course']; 

    } 

    ?> 
+3

**警告**您的代碼容易受到SQL注入攻擊。 – 2012-03-30 12:19:20

+6

你永遠不會執行你的查詢,你只需定義一個包含它的變量。 – jprofitt 2012-03-30 12:19:30

+3

@DanielA。白人脆弱?它甚至不執行它:) – 2012-03-30 12:20:18

回答

1

您將需要添加主鍵在那裏。除非主鍵是自動生成的(身份),否則不能在沒有指定主鍵的情況下向數據庫添加行。

編輯:正如Damien指出的那樣,您需要在定義$ sql變量後添加以下行。

mysql_query($sql) 
+3

是的,並使用mysql_query()也許? – 2012-03-30 12:20:42

+0

達米恩是對的,我完全忘了使用mysql查詢。我是一個白癡。謝謝:) – user1394925 2012-03-30 12:22:49

+0

呀沒看到,好地方達明我已經把它添加到我的編輯+1你:) – mattytommo 2012-03-30 12:23:35

1

您的問題的答案是否定的。您不能像這樣向數據庫中插入值(不插入主鍵的某個值)

+0

他可以PK沒有必要afaik(它可能只是一個AI)。只是他沒有這樣做。 – 2012-03-30 12:26:33

+0

但是,如果數據庫有一個PK,那麼它的價值需要被插入,除非另有自動生成 – 2012-03-30 12:28:41

1

不應該在某處執行SQL查詢嗎?目前,你所做的只是將sql查詢分配給一個變量。它從未被執行。

(另外,做谷歌搜索鮑比表...)

1

是否缺少了 「的mysql_query」 聲明?

mysql_query($sql); 

你必須改變你寫的查詢方式。攻擊是開放的!

+0

好,_this_易受注射 – 2012-03-30 12:22:18

+0

@DamienPirsy:是的。我在答覆中提到,並upvoted由丹尼爾 – Shyju 2012-03-30 12:24:00

+0

恕我直言,這個問題,這將是更好的_correct_而不是說答案,第一評論「這是代碼,但不要做這樣的」 :) – 2012-03-30 12:25:02

1

的代碼的給定段改成這樣:

<?php 
    session_start(); 
    $username="xxx"; 
    $password="xxx"; 
    $database="mobile_app"; 
    mysql_connect('localhost',$username,$password); 
    @mysql_select_db($database) or die("Unable to select database"); 
    if (isset($_POST['course'])) { 
    $_SESSION['course'] = $_POST['course']; 
    $sql="INSERT INTO Session (Course) VALUES (' ". mysql_real_escape_string($_POST['course']) . "');"; 
    } 
    mysql_query($sql); 
    mysql_close(); 
?> 
1

嗯..你必須執行查詢,實際上是INSERT聲明生效。

至於一般的代碼,你必須從這麼古老的教程中學到東西。現在的功能已經超過10年了,不再維持。 您不應使用mysql_*函數編寫任何新代碼。 PHP社區已經轉向make them deprecated。您應該使用PDOMySQLi

停止濫用錯誤抑制運算符@。它很慢,在大多數情況下被認爲是有害的。

相反喲應該寫類似:

// connect to database 
$connection = new PDO('mysql:host=localhost;dbname=mobile_app;charset=UTF-8', 
         'username', 'password'); 
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

// set up the query 
$query = 'INSERT INTO Session (Course) VALUES(:course)'; 
$statement = $connection->prepare($query); 
$statement->bindParam(':course', $_POST['course'], PDO::PARAM_STR, 63); 
// last parameter is max length of field in the table 

// perform the query 
if ($statement->execute()) 
{ 
    // everything worked 
} 

如果你想了解如何使用PDO與MySQL:this tutorial會有所幫助。如果認爲MySQLi API會是一個更好的選擇,那麼你將不得不自己找一些。