MYSQL数据库出现问题,未插入值

时间:2010-02-23 11:40:07

标签: php mysql

我正在尝试在数据库中插入值并且未插入值,这是我的代码:

    $user_name = "username";
    $password = "password";
    $database = "database";
    $server = "localhost";
    $db_handle = mysql_connect($server, $user_name, $password);
    $db_found = mysql_select_db($database, $db_handle);

    if ($db_found) {

    $SQL = 'INSERT INTO table (anInt, DomainName, URL, Rank, PageRank, Google, Bing, Boss, IndexedPage, Backlinks) VALUES ($anInt, $Domain, $URL, $Rank, $Pagerank, $Google, $Bing, $Yahoo, $Pages, $backlinks)';
    $result = mysql_query($SQL);
    mysql_close($db_handle);

    print "Records added to the database";

正在打印添加到数据库中的记录,但是在查看数据库时没有添加任何内容。一些值是双精度数,文本数和整数。有没有调试这个?如果有人问我,我会在帖子中添加更多信息。

当然我还有一个其他声明,我只是认为它不相关,因为它告诉我记录已添加。

7 个答案:

答案 0 :(得分:4)

首先,您应该使用mysql_real_escape_string转义传递给SQL查询的字符串值。

然后,您应该在SQL查询中添加引号,并在包含字符串的字段周围添加引号。


我真的不知道哪些字段是整数,哪些字段是字符串,但你应该使用这样的东西来构建你的SQL查询:

// Escape the string data, and make sure integer really contain integers
$anInt = intval($anInt);
$Domain = mysql_real_escape_string($Domain);
$URL = mysql_real_escape_string($URL);
$Rank = intval($Rank);
$Pagerank =  = intval($Pagerank);
$Google = intval($Google);
$Bing = intval($Bing);
$Yahoo = intval($Yahoo);
$Pages = intval($Pages);
$backlinks = intval($backlinks );

// Build the SQL query, using the "safe" variables
$SQL = 'INSERT INTO table (anInt, DomainName, URL, Rank, PageRank, Google, Bing, Boss, IndexedPage, Backlinks) 
        VALUES ($anInt, '$Domain', '$URL', $Rank, $Pagerank, $Google, $Bing, $Yahoo, $Pages, $backlinks)';

这假设只有DomainNameURL包含字符串 - 您可能必须使用mysql_real_escape_string并在某些其他字段的值周围添加引号,如果需要


然后,您应该查看mysql_query的返回值:对于insert查询,如果出现错误,它将返回false

此处,如果您的$result变量为false,则应使用mysql_errormysql_errno:它们会让您知道发生了什么错误 - 它会有所帮助例如,检测SQL查询中的错误。


如果这不能解决问题,您应该尝试输出SQL查询,并使用phpMyAdmin之类的命令运行它,以确保它没问题。

答案 1 :(得分:2)

我不是PHP专家,但我有2条评论。

  1. 您不检查错误(可能使用mysql_errno()),因此您不知道是否添加了记录

  2. 我认为值(如果是字符串)应该像

    一样给出

    '$域'

  3. 即使用'字符进行转义。

    当然,更好的是使用像

    这样的东西
    $sql = sprintf("INSERT ... VALUES(%d, '%s', '%s',...)", 
                   $anInt, mysql_real_escape_string($Domain), ...);
    

    如果您插入用户提供的输入。

答案 2 :(得分:2)

您可以检查$ result:

$result = mysql_query($query);
if (!$result) {
    print "An error occured: " . mysql_error() . "\n";
}

我的猜测是你传递的字符串没有引号,例如:

VALUES (Hello)

你应该把它传递给:

VALUES ('Hello')

与评论者说的一样,如果用户可以控制这些字符串,那么您就会接受SQL注入攻击。您可以通过转义字符串来阻止该攻击,例如:

$query = sprintf("INSERT INTO table (DomainName) VALUES ('%s')",
        mysql_real_escape_string($domain_name));

答案 3 :(得分:2)

在SQL查询中,您需要正确地引用字符串,否则会产生错误。因此,用于在数据库中存储非int或非布尔值的所有变量都需要围绕值的引号。

此外,您应首先使用mysql_real_escape_string转义所有值,确保SQL注入不是问题。

答案 4 :(得分:2)

除了sql注入,你的错误处理还没有完成......

if (!$db_found) {
  echo "datbase not found.";
}
else {
  $SQL = 'INSERT INTO
      table
      (...)
    VALUES
      (...)
  ';
  $result = mysql_query($SQL, $db_handle);
  if ( !$result ) {
    echo "error: ", mysql_error($db_handle);
  }
  else {
    print "Records added to the database";
  }
}
mysql_close($db_handle);

如果查询导致错误,mysql_query()返回FALSE,mysql_error()将告诉您有关错误的更多信息。

答案 5 :(得分:1)

代码存在安全问题,但解决了一个问题

您没有在SQL语句中将字符串值括在引号中。

答案 6 :(得分:0)

首先,请考虑其他人对安全数据库处理和避免注射的建议。

您的查询没有做任何事情的原因可能是您将字符串括在单引号中。在PHP中,单引号将字符串强制为字面值。与使用双引号时不同,变量不会被替换。因此'$foo'代表字符序列'$'.'f'.'o'.'o'。另一方面,"$foo"表示变量$foo在字符串定义时包含的字符序列。

您可以使用mysql_error()来解决MySQL的大多数问题。即使消息没有帮助你,你至少知道查询是否被正确解析,即问题所在的连接的哪一端。