2012-01-27 82 views
3

当我尝试更新我的表格而不是通过url数组递增时,打印到表格的内容只是url数组中的最后一项。使用foreach更新MySQL表格()

当我回应$url我可以告诉它通过适当的阵列循环。当我回应$currentId是正确增量。为什么查询不会在我的表格的每一行中输入每个$url。这里发生了什么,我不明白?

$currentId = 1; 
foreach($pages as $url) 
{ 
    $query = "UPDATE pageurls SET url='$url' WHERE id='currentId'"; 
    mysql_query($query); 
    echo($url.'<br/>'); 
    $currentId++; 
} 

回答

5

您比较字符串:WHERE id='currentId'

应该是一个变量WHERE id='$currentId'

2

currentId作为一个字符串,而不是一个变量。

此外,你应该确保你逃避那些值与mysql_real_escape_string()

+2

这是不是真的对用户的输入,它是关于如何确保MySQL的东西认为是一个特殊字符将被正确处理。这是一个很好的习惯。 – 2012-01-27 13:51:54

+0

@Topener:由于系统需要由某人编程,所以仍然是“用户”输入(特别是如果你使用初级编码器)。尽管如此,a)使用正确的类型(例如'(int)$ currentId')或者b)参数化查询可能更好,而不是盲目地将所有东西都转换为字符串。 – Piskvor 2012-01-27 14:05:40

10

而不是

$query = "UPDATE pageurls SET url='$url' WHERE id='currentId'"; 

...这看起来匹配的字符串 “currentId” 的ID,尝试...

$query = "UPDATE pageurls SET url='".mysql_real_escape_string($url). 
     "' WHERE id=".$currentId; 

由于你自己生成currentId,它是安全的,但你应该真的使用mysql_ref来逃避$ url al_escape_string。

编辑:正如@Topener指出的,我错过了currentId之前的一个$编辑来解决这个问题。

+0

仍然不对,这会引发错误。看到我的回答 – 2012-01-27 13:48:06

+0

@Topener其实,手册中指出: “在向MySQL发送查询之前,必须始终(除少数例外)使用此功能以确保数据安全。”,甚至您自己创建的字符串都可以包含“'”字符。 – 2012-01-27 13:53:31

+0

@Topener:这不会引发错误。如果你指的是他遗漏了单引号的事实,它可能是故意完成的,因为在任何给定的模式中,名为id的列是10的9倍,并且这是支持的在OP的这一行:'$ currentId = 1'。 – FtDRbwLXw6 2012-01-27 13:54:05

0

有在这一行错误:

$query = "UPDATE pageurls SET url='$url' WHERE id='currentId'"; 

我会改变这样的:

$query = "UPDATE pageurls SET url='".$url."' WHERE id=".$currentId; 
0

确保你正确转义的变量在查询中使用(貌似intval()id/$currentId如果这是来自用户输入或任何外部来源,并mysql_real_escape_string()url,如@路易斯说)。然后将它们插入到查询中,如果它确实是一个整数,则不要引用$currentId

$currentId = 1; 

foreach($pages as $url) { 

    $query = "UPDATE pageurls SET url = '{$url}' WHERE id = {$currentId}"; 

    mysql_query($query); 

    echo($url . '<br/>'); 

    $currentId++; 

} 
// foreach 
-1

您正在使用字符串而不是变量!

此查询不可用!如果你更新了很多行,它会占用大量的资源!

看一看:“Update Multiple Rows With Different Values and a Single SQL Query

+0

只有21行,因为我想弄清楚为什么echo会打印正确的东西(因此我知道变量每次都通过循环获取正确的值),但mysql表只打印url的最后一个值21次。 – user1155445 2012-01-27 15:45:11