PHP ODBC从字符串中提取子字符串以创建变量

时间:2014-06-30 19:42:08

标签: php odbc substring substr

我甚至不确定这是否可行。我已经谷歌搜索了这个,但我找不到我需要的东西。

基本上,我有一个返回字符串的查询。字符串很长,似乎有*作为“分隔符”。它仍然只有一个字符串。

我需要做的是,将前两个实际单词转换为变量。

返回字符串时,它看起来类似于:

 ABCD*RANDOMNAME*VB259E*5301*26042014*4992*K*CMAU

如您所见,每个部分都有*分隔。

我需要提取前两部分,其中它读取ABCD和RANDOMNAME。当然,前4个字符也是随机的,但总是4个字符。在第一个*读取RANDOMNAME之后,此部分可能包含更多或更少的字符。但是在第二个*之后我不需要任何东西。

我想我必须使用substr函数,但在这种情况下我不确定如何应用它。

我检索结果如下:

 <?php
   voyage = $_POST['voyage'];
   $query = "SELECT blah blah blah FROM blah WHERE blah = '$voyage'";

   $result = odbc_exec($connect, $query);  // result is a long string as detailed above

   $first = ""; // first substring
   $second = "";  // second substring

  // both would go into this next variable

 $dateFile = $first . " - " . $second . " - " . $voyage . " - " . date('dmY'). ".txt";

 ?>

正如您所看到的,我需要提取子字符串以创建文本文件的名称。

2个子串将进入变量$ first和$ second。

我将不胜感激。

请请 - 我仍在尝试掌握PHP和MYSQL。我的客户端正在使用Oracle数据库,所以我真的开始使用PHP和ODBC命令。请原谅我对此事的无知。如果您有一个对我有帮助的答案,那么请务必协助。如果没有,请转到下一个问题。

1 个答案:

答案 0 :(得分:0)

这是一个SQL或PHP字符串操作问题,而不是其他任何问题,并且不应该太困难。您可以将列中存在的字符串提取到PHP中并在那里进行操作,或者完全在SQL中完成,只需从分离的列中提取。

这是SQL示例:

select 
    left(
        'ABCD*RANDOMNAME*VB259E*5301*26042014*4992*K*CMAU', 
        locate('*', 'ABCD*RANDOMNAME*VB259E*5301*26042014*4992*K*CMAU') - 1) as first, 
    substring(
        'ABCD*RANDOMNAME*VB259E*5301*26042014*4992*K*CMAU', 
        locate('*', 'ABCD*RANDOMNAME*VB259E*5301*26042014*4992*K*CMAU'), 
        locate('*', 'ABCD*RANDOMNAME*VB259E*5301*26042014*4992*K*CMAU', locate('*', 'ABCD*RANDOMNAME*VB259E*5301*26042014*4992*K*CMAU') + 1) - locate('*', 'ABCD*RANDOMNAME*VB259E*5301*26042014*4992*K*CMAU')) as second 

我在这里使用了一个字符串文字来表示您正在尝试提取的字符串,我假设您在SQL中使用列引用。请注意,这是使用ODBC标量函数,您可能需要在某些ODBC驱动程序中包含{fn ...}中每个left / locate / substring的调用。 SQL非常混乱,但它确实有效。

第二个也可能更容易的解决方案是在PHP本身中进行提取:

$string = 'ABCD*RANDOMNAME*VB259E*5301*26042014*4992*K*CMAU';

$firstStarIndex = strpos($string, '*');
$first = substr($string, 0, $firstStarIndex);
$second = substr($string, $firstStarIndex + 1, strpos($string, '*', $firstStarIndex + 1) - $firstStarIndex - 1);

请注意,为简洁起见,省略了错误检查和验证。