我正在尝试在数据库中插入值并且未插入值,这是我的代码:
$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";
正在打印添加到数据库中的记录,但是在查看数据库时没有添加任何内容。一些值是双精度数,文本数和整数。有没有调试这个?如果有人问我,我会在帖子中添加更多信息。
当然我还有一个其他声明,我只是认为它不相关,因为它告诉我记录已添加。
答案 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)';
这假设只有DomainName
和URL
包含字符串 - 您可能必须使用mysql_real_escape_string
并在某些其他字段的值周围添加引号,如果需要
然后,您应该查看mysql_query
的返回值:对于insert
查询,如果出现错误,它将返回false
。
此处,如果您的$result
变量为false
,则应使用mysql_error
和mysql_errno
:它们会让您知道发生了什么错误 - 它会有所帮助例如,检测SQL查询中的错误。
如果这不能解决问题,您应该尝试输出SQL查询,并使用phpMyAdmin之类的命令运行它,以确保它没问题。
答案 1 :(得分:2)
我不是PHP专家,但我有2条评论。
您不检查错误(可能使用mysql_errno()),因此您不知道是否添加了记录
我认为值(如果是字符串)应该像
一样给出'$域'
即使用'字符进行转义。
当然,更好的是使用像
这样的东西$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的大多数问题。即使消息没有帮助你,你至少知道查询是否被正确解析,即问题所在的连接的哪一端。