2017-01-08 25 views
-3

PHPでは動作しませんが、MySQLではうまく動作するmysqlクエリがあります。 以下は、POST変数を処理し、mysqlクエリ用に処理するHTMLフォームの部分的なコードです。PHP mysqlクエリはPHPでは動作しませんが、MySQLでうまく動作します

以下を参照してください。

<?php 

$codes = $_POST['codes']; 

// get as array like so 
$barcodes = explode("\n", $codes); 

// build up string of barcodes 
$barcode_str = ""; 
$prefix = ''; 
foreach ($barcodes as $barcode){ 
    $barcode_str .= $prefix . "'" . $barcode . "'"; 
    $prefix = "," ; 
} 
$dbhost = 'localhost:3036'; 
$dbuser = 'xxxx'; 
$dbpass = 'xxxx'; 

$conn = mysql_connect($dbhost, $dbuser, $dbpass); 
if(! $conn) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 
mysql_select_db('disks'); 
$sql = "SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result 
     FROM hdds WHERE serial IN ($barcode_str) ;"; 

echo $sql; 


$retval = mysql_query($sql, $conn); 
if(! $retval) 
{ 
    die('Could not get data: ' . mysql_error()); 
} 

$result = mysql_query($sql); 
while($row = mysql_fetch_array($result)) { 
echo $row['manu']; 
} 

while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) 
{ 

/** Lets remove 20000000000000 bytes values from capacity array */ 
preg_match('/\[(.*?)\]/', $row['capacity'], $matches); 
if (isset($matches[1])) { 
    $row['capacity'] = $matches[1]; 
} 
echo '<tr>'; 
echo 
    "<td> {$row['manu']} </td>". 
    "<td> {$row['model']} </td>". 
    "<td> {$row['serial']} </td>". 
    "<td> {$row['capacity']} </td>". 
    "<td> {$row['firmware']} </td>". 
    "<td> {$row['method']} </td>". 
    "<td> {$row['date']} </td>". 
    "<td> {$row['stime']} </td>". 
    "<td> {$row['etime']} </td>". 
    "<td> {$row['wks']} </td>". 
    "<td> {$row['result']} </td>". 
    "<td> <a href=\"certificate.php?Customer={$row['cust']}&serial={$row['serial']}&manu={$row['manu']}&capacity={$row['capacity']}&method={$row['method']} \">Print</a>"; 


/**      foreach($row as $key=>$value) { 
           echo '<td>',$value,'</td>'; 
         }*/ 
         echo '</tr>'; 
} 
mysql_close($conn); 


    ?> 

上記のように、私は$ sqlクエリをエコーし​​て、画面に次のように表示されます。

SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result FROM hdds WHERE serial IN ('5MQ3DJPM ','5MQ3DJPM ','5MQ3DJPM ','') ; 

このクエリを実行すると、行が戻ってきています。

PHPでは何も返されませんが、エラーはありません。

しかし、PHPクエリを静的クエリに置き換えても機能しますが、変数を使用してクエリを動作させたいのです。

+0

[mysql_ *]を使用しないでください(http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php?rq=1)。 mysql_ *関数は時代遅れであり、非推奨です(http://us3.php.net/manual/en/intro.mysql.php)。 ['MySQLi'](http://us3.php.net/manual/en/book.mysqli.php)または[' PDO'](http://us3.php.net/manual/en/intro。 pdo.php)を使用してください。 –

+0

また、[** SQLインジェクション**](https://www.owasp.org/index.php/SQL_Injection)もご利用いただけます。クエリに変数を連結するのではなく、プリペアドステートメントを使用する必要があります。 「PHPでのSQLインジェクションを防ぐには?」(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1)を参照してください。 –

+1

コードで何か他のことを行う前に、上記の問題を修正する必要があります。このコードは非常に安全です。 –

答えて

1
<?php 

$codes = $_POST['codes']; 

// get as array like so 
$barcodes = explode("\n", $codes); 

// build up string of barcodes 
$barcode_str = ""; 
$prefix = ''; 
foreach ($barcodes as $barcode){ 
    $barcode_str .= $prefix . "'" . $barcode . "'"; 
    $prefix = "," ; 
} 
$dbhost = 'localhost:3036'; 
$dbuser = 'xxxx'; 
$dbpass = 'xxxx'; 

$conn = mysql_connect($dbhost, $dbuser, $dbpass); 
if(! $conn) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 
mysql_select_db('disks', $conn); 
$sql = "SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result 
     FROM hdds WHERE serial IN '$barcode_str') ;"; 

echo $sql; 


$retval = mysql_query($sql, $conn); 
if(! $retval) 
{ 
    die('Could not get data: ' . mysql_error()); 
} 

$result = mysql_query($sql, $conn); 
while($row = mysql_fetch_array($result)) { 
echo $row['manu']; 
} 

while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) 
{ 

/** Lets remove 20000000000000 bytes values from capacity array */ 
preg_match('/\[(.*?)\]/', $row['capacity'], $matches); 
if (isset($matches[1])) { 
    $row['capacity'] = $matches[1]; 
} 
echo '<tr>'; 
echo 
    "<td> {$row['manu']} </td>". 
    "<td> {$row['model']} </td>". 
    "<td> {$row['serial']} </td>". 
    "<td> {$row['capacity']} </td>". 
    "<td> {$row['firmware']} </td>". 
    "<td> {$row['method']} </td>". 
    "<td> {$row['date']} </td>". 
    "<td> {$row['stime']} </td>". 
    "<td> {$row['etime']} </td>". 
    "<td> {$row['wks']} </td>". 
    "<td> {$row['result']} </td>". 
    "<td> <a href=\"certificate.php?Customer={$row['cust']}&serial={$row['serial']}&manu={$row['manu']}&capacity={$row['capacity']}&method={$row['method']} \">Print</a>"; 


/**      foreach($row as $key=>$value) { 
           echo '<td>',$value,'</td>'; 
         }*/ 
         echo '</tr>'; 
} 
mysql_close($conn); 


    ?> 

あなたはPHPでエラーを表示することを意味する推奨されない関数を使用しています。 MySQLiに変換してみてください。

すべてのクエリで接続を使用するように構造を変更し、クエリが確実に実行されるように変更しました。クエリを実行するときに接続を使用していませんでした。

+1

これについての説明は有益であり、他者が異なる/変更された/追加されたものに関して両方のコードと比較する必要がないようにする。 –

+0

フィル、それは動作しません、まだ同じ結果。 – user2107349

+0

私は新しいクエリで編集しました。しかし、これを試してみてください: '' 'sql =" "CUST、manu、モデル、シリアル、容量、ファームウェア、メソッド、日付、タイム、エイム、wks、結果 FROM hdds WHERE serial = '$ barcode_str'"; '' @ user2107349 – Phil

関連する問題