2010-08-23 87 views
0

我使用此代碼插入MySQL表一些值:將數據插入到MySQL表奇怪的例外

<?php 
mysql_connect("localhost","root","root"); 
mysql_select_db("bib"); 

$id = "12"; 
$titlu = "Joe"; 

$query = "INSERT INTO carte SET id='$id', titlu='$titlu'"; 
$result = mysql_query($query); 

// Display an appropriate message 
if ($result) 
echo "<p>Product successfully inserted!</p>"; 
else 
echo "<p>There was a problem inserting the Book!</p>"; 

mysql_close(); 
?> 

運行它進入瀏覽器後,會出現以下錯誤:

「Apache HTTP服務器有遇到問題需要關閉,對此造成的不便,我們深表歉意。「

看來,mysql_select_db(「bib」)語句導致它。數據庫建立,還表...

我正在運行的Windows XP SP PHP 5.3和MySQL 5.1 2

請任何想法,歡迎...

謝謝...

+1

對於我來說,允許應用程序以root身份登錄到數據庫似乎並不聰明 - 並且將密碼以明文形式直接放在頁面本身中。 – duffymo 2010-08-23 09:14:59

+0

httpd的錯誤日誌文件中可能有相關的東西嗎?你可能想要增加php的和該測試的httpd日誌級別。請參閱:http://httpd.apache.org/docs/2.2/mod/core.html#loglevel和http://docs.php.net/errorfunc.configuration#ini.error-reporting – VolkerK 2010-08-23 09:24:57

+0

@ user398920,轉到您的用戶配置文件,看看你以前的問題,並選擇適當的答案(點擊最佳答案上的綠色複選標記) – Jimmy 2010-08-23 09:25:36

回答

2

任何mysql_ *相關功能可能會失敗有多種原因。您必須檢查返回值,如果函數指示錯誤(通常返回FALSE),您的腳本必須做出適當的反應。
mysql_error($ link)和mysql_errno($ link)可以給你更詳細的原因信息。但是您不希望將任何細節都顯示給任何用戶,請參閱CWE-209: Information Exposure Through an Error Message

如果您沒有將mysql_connect()返回的連接資源傳遞給後續的mysql_ *函數調用,那麼php將假定上次成功建立的連接。你不應該依賴那個;更好地將鏈接資源傳遞給函數。 a)如果你每頁有多個連接,你必須通過它。 b)如果沒有有效的數據庫連接,php-mysql模塊會嘗試建立默認連接,這通常不是你想要的;它只需要更多的時間來失敗..保持。

<?php 
define('DEBUGOUTPUT', 1); 

$mysql = mysql_connect("localhost","root","root"); 
if (!$mysql) { 
    foo('query failed', mysql_error()); 
} 

$rc = mysql_select_db("bib", $mysql); 
if (!$rc) { 
    foo('select db', mysql_error($mysql)); 
} 

$id = "12"; 
$titlu = "Joe"; 

$query = "INSERT INTO carte SET id='$id', titlu='$titlu'"; 
$result = mysql_query($query, $mysql); 

// Display an appropriate message 
if ($result) { 
    echo "<p>Product successfully inserted!</p>"; 
} 
else { 
    foo("There was a problem inserting the Book!", mysql_error($mysql), false); 
} 

mysql_close($mysql); 

function foo($description, $detail, $die=false) { 
    echo '<pre>', htmlspecialchars($description), "</pre>\n"; 
    if (defined('DEBUGOUTPUT') && DEBUGOUTPUT) { 
    echo '<pre>', htmlspecialchars($detail), "</pre>\n"; 
    } 
    if ($die) { 
    die; 
    } 
} 
+0

Cool VolkerK,非常感謝它! – user398920 2010-08-23 09:41:47

+0

@ user398920:雖然你寫道這只是一個測試腳本,但請記住注意sql注入(並防止它們),請參閱http://cwe.mitre.org/data/definitions/89.html,http:// docs .php.net/mysql_real_escape_string和http://docs.php.net/pdo.prepared-statements – VolkerK 2010-08-23 09:46:27

1

嘗試這個連接到數據庫:

$mysqlID = mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD) or die("Unable to connect to database"); 
mysql_select_db(DB_DATABASE) or die("Unable to select database ".DB_DATABASE); 

也試試這個作爲你的插入查詢:

$query = "INSERT INTO carte (id, title) values ('".$id."', '".addslashes($titlu)."') 
$result = mysql_query($query) or die(mysql_error()); 

,使用模具(),它會告訴你它已經失敗,爲什麼

+0

+1做得好,顯示如何使用或死亡和mysql_error使用情況,但你也應該使用連接php mysql錯誤和選擇數據庫一樣。 – Prix 2010-08-23 09:32:26