2016-11-28 14 views
0

Twitterのような投稿のハッシュタグを独自のハッシュタグテーブルに格納するとします。私が実行している問題は、実際のマッチではなく、このループがハッシュタグ名の列に文字列「配列」を格納しているように見えるということです。これは返された配列が多次元であるという事実の問題であると思われますか?多次元配列を返すPreg_match_all - 要素へのアクセスに問題がある

preg_match_all("/\S*#(?:\[[^\]]+\]|\S+)/", $body, $matches); 
//for each loop array returned in matches 
//create_hashtag() 

//ISSUE with dimensionality of array 
foreach($matches[0] as $v){ 
    create_hashtag($dbh, $v); 
    attach_hashtag($dbh, $pid, $v); 
} 

あなたが見ることができるように、私は0番目の場所での配列を呼び出すことによってこの問題に対処しようとしたが、それは動作しませんでした。

たぶん問題が呼ばれる機能である:

function attach_hashtag($dbh, $pid, $tagname) { 
//insert into Tagged 

try { 
$sql = 'INSERT INTO Tagged (hashtag_name, post_id) 
     VALUES (:name, :pid);'; 
$stmt = $dbh->prepare($sql); 
$stmt->bindParam(':name', $tagname); 
$stmt->bindParam(':pid', $pid); 
$stmt->execute(); 

$array = [ 
    'status' => 1, 
    ]; 
    return $array; 
} catch (Exception $ex){ 
$array = [ 
    'status' => 0, 
    ]; 
    return $array; 
}} 

そして

function create_hashtag($dbh, $tagname) { 

try { 
$sql = 'INSERT INTO Hashtags (name) 
     VALUES (:name);'; 
$stmt = $dbh->prepare($sql); 
$stmt->bindParam(':name', $tagname); 
$stmt->execute(); 

$array = [ 
    'status' => 1, 
    ]; 
    return $array; 
} catch (Exception $ex){ 
$array = [ 
    'status' => 0, 
    ]; 
    return $array; 
} 
    //insert into Hashtags} 

EDIT: 私は、クエリが動作することを確認するためのvar_dumpを使用しました。

//var_dump($pid); returns proper value 
preg_match_all("/\S*#(?:\[[^\]]+\]|\S+)/", $body, $matches); 
//for each loop array returned in matches 

//echo $matches['Array']; - why does this return "Array" 
//ISSUE with dimensionality of array 
foreach($matches['Array'] as $v){ 
    create_hashtag($dbh, $v); 
    attach_hashtag($dbh, $pid, $v); //inserts into tagged, 
} 
+0

foreach($ matches ['Array'] $ v){ - これは何をすべきですか?あなたが知っていることを知らないなら、配列の中には、エコーを使わないでください。 $をvar_dumpまたはprint_rと一致させて出力します。 – Seb

+0

@Krpcannonこの質問の解決方法をお探しします。あなたは 'var_export($ matches)'を行い、あなたの質問にそのデータを投稿してから、私にpingできますか? – mickmackusa

答えて

0

私はいくつかのボディ "考案" で簡単なテストをした:

$body = 'fasd #has kfewf #tag lkfds #test 22 #fin'; 
preg_match_all("/\S*#(?:\[[^\]]+\]|\S+)/", $body, $matches); 
var_dump($matches); 

をそして結果は次のとおりです。

array(1) { 
    [0]=> 
    array(4) { 
    [0]=> 
    string(4) "#has" 
    [1]=> 
    string(4) "#tag" 
    [2]=> 
    string(5) "#test" 
    [3]=> 
    string(4) "#fin" 
    } 
} 

だからあなたの$マッチ[0] [OK]をする必要があり。さて、あなたのmysqlクエリが成功したかどうかを確認できますか? $ stmt-> execute()の戻り値を確認してください。それが間違っている場合、あなたの質問に問題があるよりも。

$result = $stmt->execute(); 
if ($!result) { 
    $error = $stmt->errorInfo(); 
    print_r($error); 
} 
+0

編集を参照してください。 $ matches配列をvar_dumpでテストすると、 'array'が返されます。 – Krpcannon

関連する問題