2010-08-23 86 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