2009-09-13 62 views
1

有没有什么办法从MySql单元获取一部分并在预定义字符后忽略所有内容? 例如,我有单元格的“ID,LINK,PHONE”行。 Inside LINK cell DB wrights链接如mysite.com/mypicture.jpeg。有没有什么办法,从这个单元格得到“mysite.com”,并忽略所有内容斜杠,所以我可以在锚标签中回显它?获取MySql行的一部分?

编辑:要绝对清楚我张贴现有代码:

<?PHP 
if(mysql_connect($db_host,$db_user,$db_pass)) { 
    mysql_select_db($db_name); 
    mysql_query("CREATE TABLE IF NOT EXISTS smsads(id bigint unsigned primary key auto_increment, link varchar(255), fromnum varchar(60))"); 
    $res = mysql_query("SELECT * FROM smsads ORDER BY id DESC LIMIT 3"); 
    while($row = mysql_fetch_object($res)) { 
     $http_link = $row->link; 
     if(strstr($http_link, 'http') === FALSE) $http_link = 'http://'.$http_link; 
     echo "<div id=\"banner\"><a href=\"{$http_link}\" target=\"_blank\"><img src=\"{$http_link}\" /></a></div>"; 
    } 
} 
?> 

回答

1

一种解决方案,在PHP端,可能是使用strpossubstr,到:

  • 发现字符的位置
  • 并提取前后的内容。

有点像这样,例如:

$str = 'mysite.com/mypicture.jpeg'; 

$position = strpos($str, '/'); 
if ($position !== false) { 
    $before = substr($str, 0, $position); 
    $after = substr($str, $position+1); 
    var_dump($before, $after); 
} 

这将让你:

string 'mysite.com' (length=10) 
string 'mypicture.jpeg' (length=14) 


如果你知道总会有一个(也是唯一一个)在您的数据斜杠,您还可以使用explodelist

list($before, $after) = explode('/', $str); 
var_dump($before, $after); 

,这将给你相同的输出:

string 'mysite.com' (length=10) 
string 'mypicture.jpeg' (length=14) 


另一个想法是做SQL一边 - 如果你需要这两个领域,但是,这样做在PHP端是不是一个坏主意(双方,PHP和SQL,实际上是有效的)


评论后编辑。

什么这样的事情,你的循环:

while($row = mysql_fetch_object($res)) { 
    $http_link = $row->link; 
    $position = strpos($http_link, '/'); 
    if ($position !== false) { 
     $before = substr($http_link, 0, $position); 
     if(strstr($http_link, 'http') === FALSE) { 
      $http_link = 'http://'.$http_link; 
      $before = 'http://' . $before; 
     } 
     echo "<div id=\"banner\"><a href=\"{$before}\" target=\"_blank\"><img src=\"{$http_link}\" /></a></div>"; 
    } 
} 

对于每一行,你所得到的$row->link$http_link变量,像你以前那样。

然后:

  • 您提取前的 '/' 自带的一部分;并用它为a href标签,链接到的网站
  • 您使用的完整网址数据库的根,为img src标签,以显示图像

而且你不要忘了如果有必要,可以将'http://'添加到这两个网址,就像您在第一个地方做的那样,只有一个网址。

注意:该代码没有经过测试,但应该给你一个可能的解决方案暗示。

希望这有助于:-)

+0

这听起来绝对是逻辑。但问题是我没有预定义的链接放在$ str。在我的PHP文件中,即将到来的链接在“$ http_link = $ row-> link;”内。 我可以把$ str ='$ http_link';? – Spoonk 2009-09-13 11:58:15

+0

我刚刚使用$ str变量作为例子;当然,你可以使用任何你想要的变量,包括$ row->直接链接。你不应该使用$ str ='$ http_link';尽管如此,因为简单引号不允许可变插值。使用$ str = $ http_link;会更好 - 但是,为什么不直接使用$ http_link? – 2009-09-13 12:05:01

+0

原谅我的无能,但我真的不知道如何。这是我第一次需要做这种魔法,并且我读了大约6或7次的帖子,试图了解我发布的现有代码中的交易的位置和方式。:( – Spoonk 2009-09-13 12:08:17

1

事情是这样的:

SELECT substring_index(substring_index('http://google.com/path?blah=1&2.1','/',3),'/',-1) 

将工作或完整的URL。

编辑:添加例如用于部分网址:

select substring_index('google.com/path?blah=1&2.1','/',1); 

在你的情况下,更换

$res = mysql_query("SELECT * FROM smsads ORDER BY id DESC LIMIT 3"); 

$res = mysql_query("SELECT link,substring_index(link,'/',1) host FROM smsads ORDER BY id DESC LIMIT 3"); 

这应该假设您的网址始终没有http ://部分。 (如果他们使用它,请使用我提供的其他示例)。

+0

把这个放在哪里?我没有固定的链接。我有一个链接变量 - $ http_link。如何包含它?非常感谢您的意见:) – Spoonk 2009-09-13 12:13:45

3

SELECT SUBSTRING_INDEX(link,'/',1);

应该做的伎俩。它将在第一个斜杠字符前返回所有内容

+0

文档:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index – VolkerK 2009-09-13 11:58:11

0

在客户端上使用数据库端的LINK列或数据时使用子字符串是一个选项,但取决于您在此处的操作以及有多少你可以在这个表中预期的行,我会考虑把这个字段分解成表中的一个单独的列,所以你只需要在插入时计算一次。然后,您可以对其进行索引,轻松阻止某些插入内容等。

从那里开始,根据您的需要,您可能需要进一步标准化LINK以便仅存储一次主机和域部分,键回到路径和文件名。您可以完成所有这些工作,然后为了方便起见,您可以制作一个视图,将它们放在一起供您的应用程序和用户使用。