2017-06-27 11 views
0

1つのPHPファイルの中で3つのクエリを実行する必要があります。私はmysqli_multi_query()を使用しました。最初の2つのクエリは、3番目のクエリ(INSERT)の値を返すSELECTクエリです。これまで私はこれをしてきました。PHP/MySQL:PHPの複数のクエリで別のクエリに値を渡す

<?php 

$host = "localhost"; 
$user = "smartbusarrival_grouplog"; 
$password = "[email protected]"; 
$db = "smartbusarrival_sbaDB"; 

$u_id = 51; 
$b_id = 1; 
$t_id = 1; 
$date = '2017-06-30'; 
$startHalt = "Kaduwela"; 
$endHalt = "Nugegoda"; 

$seats = array(42,43); 

$con = mysqli_connect($host,$user,$password,$db); 

$query = "CALL getHaltTag('$t_id','$startHalt');"; 
$query .= "CALL getHaltTag('$t_id','$endHalt');"; 
$query .= "INSERT INTO reservation (user_id,bus_id,trip_id,date,start,end) values ('$u_id','$b_id','$t_id','$date','$startTag','$endTag')"; 

if(mysqli_multi_query($con, $query)){ 
    do{ 
     if($result = mysqli_store_result($con)){ 
      while ($row = mysqli_fetch_array($result)){ 
       $startTag = $row[0]; 

       $endTag = $row[1]; 

      } 
      mysqli_free_result($result); 
     }   
    } 
    while (mysqli_next_result($con)); 
} 

mysqli_close($con); 
?> 

最初の2つのクエリはうまく動作し、正解を返します。 新しいレコードを挿入するときにコードが正常に機能します。しかし、開始と終了の値はゼロです。

+2

[Little Bobby](http://bobby-tables.com/)は*** [あなたのスクリプトはSQLインジェクション攻撃の危険性があると言います。](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)*** [準備された]について学ぶ(http://en.wikipedia.org/ wiki/Prepared_statement)ステートメント([MySQLi](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php))。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! –

+0

'$ startTag'と' $ endtag'は実行時に定義されていません。エラー報告を使用する。 – chris85

答えて

0

複数のクエリを使用することはできません。これは、それらを設定するフェッチを実行する前に変数を3番目のクエリに置き換えているためです。別のクエリとしてそれらを実行してください。

$query = "CALL getHaltTag('$t_id','$startHalt');"; 
$result = mysqli_query($con, $query); 
$row = mysqli_fetch_row($result); 
$startTag = $row[0]; 

$query = "CALL getHaltTag('$t_id','$endHalt');"; 
$result = mysqli_query($con, $query); 
$row = mysqli_fetch_row($result); 
$endTag = $row[0]; 

$query = "INSERT INTO reservation (user_id,bus_id,trip_id,date,start,end) values ('$u_id','$b_id','$t_id','$date','$startTag','$endTag')"; 
mysqli_query($con, $query); 

一般に、マルチクエリが本当に必要な状況はほとんどなく、通常はコードが複雑になります。

そして、getHaltTagをストアドプロシージャからストアドファンクションに変更すると、3つの個別のクエリは必要ありません。

$query = "INSERT INTO reservation (user_id,bus_id,trip_id,date,start,end) 
     values ('$u_id','$b_id','$t_id','$date',getHaltTag('$startHalt'),getHaltTag('$endHalt'))"; 
関連する問題