2017-10-11 4 views
0

私は、ドキュメントのリンクがクリックされると、DB内のドキュメントの "表示された"ステータスを更新するPHPスクリプトが呼び出されるというWebappがあります。これは、クリックが発生したときに呼び出されるスクリプトです:"サブクエリは副問合せなしで1行以上を返します"

<?php 
include '../../variables.php'; 

// The document that is passed through POST 
$document = $_POST['document']; 

$conn = new mysqli($dbhost, $dbuser, $dbpassword, $db); 

if (!$conn){ 
    die('Could not connect to db: '.mysqli_error($conn)); 
} 

$sql = "UPDATE files 
     SET docViewed = '1' 
     WHERE fileloc = '$document'"; 
$query = mysqli_query($conn, $sql); 

if (!$query){ 
    die('Could not update docViewed: '.mysqli_error($conn)); 
} 
?> 

あなたが見ることができるように、私は私がしたいフィールドを更新MySQLのクエリで何のサブクエリを持っていない、まだ私はまだ、このエラーが発生します:

Could not update docViewed: Subquery returns more than 1 row

私は、クエリに追加しようとしている:

"... 
WHERE fileloc = '$document' 
LIMIT 1"; 

はしかし、私はまだ同じ結果を得ます。

明らかにすると、各$documentはデータベース内でUNIQUEでなければならないため、重複するエントリはありません。

UPDATE:この投稿は、OPがサブクエリを使用しているため、提案された投稿と重複していません。この例では、どこでもサブクエリを使用していません。

私が使用しているfilesテーブルの構造は次のとおりです。私はこのエラーを生成するために起こっている実際のMySQLのクエリを絞り込んてい:

enter image description here

UPDATE 2:また$documentの重複がないを示すために、私は30294/1506012960606.pdfあるfilelocてテーブルをフィルタ処理しました:

UPDATE files 
SET docViewed = '1' 
WHERE fileloc = '30294/1492682311085.pdf' 
+0

ファイルがテーブルであり、ビューではありませんか? –

+0

ファイルは確かにそれ自身のテーブルです – Jodo1992

+0

その投稿でOPが実際にサブクエリを使用しているので、重複していません。私は – Jodo1992

答えて

1

これはあまり変更されませんが、問題が発生している場所を掘り下げるためにいくつかのログポイントが追加されます。 mysqliの使い方をオブジェクト指向のアプローチに更新し、プリペアドステートメントを使用してクエリをパラメータ化する(SQLインジェクションを避けるためには良いが、この場合はいくつかのステップでクエリをテストできるため実用的である)。

<?php 
try { 
    include '../../variables.php'; 

    // The document that is passed through POST 
    $document = filter_input(INPUT_POST, 'document', FILTER_SANITIZE_STRING); 

    $conn = new mysqli($dbhost, $dbuser, $dbpassword, $db); 

    if ($conn->connect_error){ 
     throw new Exception("({$conn->errno}) {$conn->error}"); 
    } 

    $sql = "UPDATE files 
      SET docViewed = '1' 
      WHERE fileloc = ?"; 
    $stmt = $conn->prepare($sql); 

    if (!$stmt) { 
     throw new Exception("({$conn->errno}) {$conn->error}"); 
    } 
    $stmt->bind_param('s', $document); 
    $exec = $stmt->execute(); 

    if (!$exec) { 
     throw new Exception($stmt->error); 
    } else if ($stmt->affected_rows === 0) { 
     throw new Exception('No file location found'); 
    } 


} catch (Exception $e) { 
    error_log($e); 
    die($e->getMessage()); 
} 
?> 
関連する問題