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


PHP ODBC extract substrings from string to create variables

我甚至不确定这是否可能。我用谷歌搜索了一下,但我没有找到我需要的东西。

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

我需要做的是,把前两个实际的单词变成变量。

当返回字符串时,它看起来像这样:

 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";
 ?>
如您所见,我需要提取子字符串来为文本文件创建一个名称。

这两个子字符串将被放入变量$first和$second中。

我很感激你的帮助。

PLEASE PLEASE PLEASE -我还在努力掌握PHP和MYSQL。我的客户正在使用Oracle数据库,所以我实际上只是开始使用PHP和ODBC命令。请原谅我对这件事的无知。如果你有一个对我有帮助的答案,那么请尽一切努力帮助我。如果没有,请继续下一题

这更像是一个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标量函数,您可能需要将left/locate/substring的每次调用包装在{fn…}在一些ODBC驱动程序中。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);

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