2016-04-10 40 views
1

PHPでこのクエリを実行しようとしていますが、falseを返し続けます。私はphpMyAdminでクエリを試してみました。誰かが何が間違っているかを知ることができればそれはうまくいくでしょう。また、私はこのような問題のためにいくつかのより良いエラーメッセージを得ることができますので、私は問題を解決して解決することができますか?PHPでfalseを返すSQLクエリ

$stmt = $conn->prepare("SELECT * FROM artist WHERE artID != ?;"); 
if(!$stmt) 
{ 
    echo "Error creating SQL statement"; 
    return 1; 
} 

私はすでにそれはそれを行うには何がある場合ので、私にはわからない細かい動作しますPHPコードの同じブロックに異なるクエリの$stmt = $conn->prepare(query);を使用しています。事前:)で

おかげで

EDIT

:私は頼まれた私は、バインドどこ '?'クエリで使用されます。 $stmt->bind_param('i', $albumArtID); ifステートメントの echoが実行されているので、私は bind_paramの前にエラーが発生していたと考えていました。

EDIT 2:ここでの要求に応じて、接続を作成するために使用するコードです:

<?php 
error_reporting(-1); 
ini_set('display_errors', 'On'); 

$db_host = 'localhost'; 
$db_user = 'root'; 
$db_pass = ''; 
$db_name = 'psyjb6'; 

$conn = new mysqli('localhost', 'root', '', 'psyjb6'); 
if ($conn->connect_errno) 
    echo"<p>failed to connect to database</p>"; 
?> 

EDIT 3:ここでうまくいけば、我々はこれを理解することができ、そのページからコードの全体の主なセクションです:

<form name="editAlbum" method="get" onsubmit="return validateForm(this)"> 

         <div class="row"> 
          <?php 
          error_reporting(E_ALL); 
          ini_set('display_errors', 1); 
          include 'connection.php'; 

          if(isset($_GET["album"])) 
          { 
           /* If album was passed in the URL then get current values 
            for that album */ 
           $stmt = $conn->prepare("SELECT cd.artID, artName, cdTitle, cdPrice, cdGenre, cdTracks FROM cd INNER JOIN artist ON (cd.artID = artist.artID AND cdID = ?);"); 
           if(!$stmt) 
           { 
            echo "Error creating SQL statement"; 
            exit; 
           } 

           $albumID = htmlspecialchars($_GET["album"]); 

           $stmt->bind_param('i', $albumID); 
           $stmt->execute(); 

           $stmt->bind_result($albumArtID, $albumArtName, $albumTitle, 
                $albumPrice, $albumGenre, $numTracks); 

           $stmt->fetch(); 

           /* Create input fields */ 
           // Album Title 
           echo "<div class=\"row horizontal-center\">" . 
            "<input type=\"text\" value=\"" . htmlspecialchars($albumTitle) . "\" name=\"albumTitle\"/>" . 
            "</div>"; 

           // Artist Name 
           echo "<div class=\"row horizontal-center\">" . 
             "<h6>By Artist:</h6>" . 
             "</div>"; 

           echo "<div class=\"row horizontal-center\">" . 
             "<select name=\"artID\">"; 

           /* Create option for current artist so it will be first in list */ 
           echo "<option value=\"$albumArtID\">$albumArtName</option>\n"; 

           /* Generate list of artists except artist currently associated with the album */ 
           $stmt = $conn->prepare("SELECT * FROM artist WHERE artID != ?"); 
           if($stmt === false) 
           { 
            echo $conn->error; 
            echo "hi"; 
            exit; 
           } 

           $stmt->bind_param('i', $albumArtID); 
           $stmt->execute(); 

           $stmt->bind_result($artID, $artName); 

           /* Check if no artists were found */ 
           if(!$stmt->fetch()) 
            echo "<p>No artists were found!</p>"; 
           else 
           { 
            /* Create options for artists that were found */ 
            do 
            { 
             echo "<option value=\"$artID\">$artName</option>\n"; 
            }while($stmt->fetch()); 
           } 

           echo "</select>" . 
            "</div>"; 

           // Album Price 
           echo "<div class=\"row horizontal-center\">" . 
             "<input type=\"number\" step=\"0.01\" value=\"" . htmlspecialchars($albumPrice) . "\" name=\"albumPrice\"/>" . 
            "</div>"; 

           // Album Genre 
           echo "<div class=\"row horizontal-center\">" . 
             "<input type=\"text\" value=\"" . htmlspecialchars($albumGenre) . "\" name=\"albumGenre\"/>" . 
            "</div>"; 

           // Number of Tracks 
           echo "<div class=\"row horizontal-center\">" . 
             "<input type=\"number\" value=\"" . htmlspecialchars($numTracks) . "\" name=\"numTracks\"\n/>" . 
            "</div>"; 

           // Delete checkbox 
           echo "<div class=\"row\">" . 
             "<div class=\"col-2\">" . 
              "<h6>Delete:</h6>" . 
             "</div>" . 
             "<div class=\"col-1\">" . 
              "<input type=\"checkbox\" name=\"delete\" value=\"Delete\"/>" . 
             "</div>" . 
            "</div>"; 

           /* Create hidden field to submit the album ID with the form */ 
           echo "<input type=\"hidden\" value=\"" . htmlspecialchars($albumID) . "\" name=\"albumID\"\n/>"; 
          } 
          else 
          { 
           /* Send browser back to artists page if they somehow accessed 
            the edit page without going through the "Edit" link next 
            to an artist in the table. This would be the artName variable 
            would not be sent via the URL.*/ 
           header("Location: artists.php"); 
          } 
          ?> 
         </div> 

         <div class="row"> 
          <div class="col-2"> 
           <h6>Delete:</h6> 
          </div> 
          <div class="col-1"> 
           <input type="checkbox" name="delete" value="Delete"/> 
          </div> 
         </div> 
         <div class="row"> 
          <input type="submit" name="submit" value="Update"/> 
         </div>  

         <!-- PHP to edit album data --> 
         <?php 
         include 'connection.php';            

         if(isset($_GET["delete"])) 
         { 
          $albumID = $_GET["albumID"]; 

          /* Create DELETE query */ 
          $stmt = $conn->prepare("DELETE FROM cd WHERE cdID = ?;"); 
          if(!$stmt) 
          { 
           echo "Error creating SQL statement"; 
           exit; 
          } 

          $stmt->bind_param('i', $albumID); 

          $stmt->execute(); 
         } 
         else if(isset($_GET["albumTitle"]) && isset($_GET["albumGenre"]) 
          && isset($_GET["albumPrice"]) && isset($_GET["numTracks"])) 
         { 
          $albumTitle = htmlspecialchars($_GET["albumTitle"]); 
          $artID = htmlspecialchars($_GET["artID"]); 
          $albumGenre = htmlspecialchars($_GET["albumGenre"]); 
          $albumPrice = htmlspecialchars($_GET["albumPrice"]); 
          $numTracks = htmlspecialchars($_GET["numTracks"]); 

          /* Create INSERT query */ 
          $stmt = $conn->prepare("UPDATE cd SET (cdTitle = ?, artID = ?, 
           cdGenre = ?, cdPrice = ?, cdTracks = ?) WHERE cdID = ?;"); 
          if(!$stmt) 
          { 
           echo "Error creating SQL statement"; 
           exit; 
          } 

          $stmt->bind_param('sisdi', $albumTitle, $artID, $albumGenre, 
               $albumPrice, $numTracks); 

          $stmt->execute(); 
         } 
         ?> 

        </form> 
+0

あなたは 'artID'と比較される値をどこにバインドしていますか? –

+0

あなたは 'mysqli_'や' PDO'を使っていますか?あなたがわからない場合は、接続に使用するコードを表示してください。 – RiggsFolly

+1

@AlBundy質問が表示されるように更新しました。 –

答えて

0

パラメータ化クエリを使用している場合は、準備クエリを実行するときにパラメータの値を渡す必要があります。

また、準備クエリをexecuteにする必要があります。 prepareは、コンパイルと最適化のためにクエリをデータベースに渡すだけで、実際にはクエリを実行しません。あなたはこれらのデータベース・アクセス文でエラーが発生した場合

はまた、あなたがecho "Error creating SQL statement";

ようにあなた自身を作る何かを出力するよりも多く便利ですactuallエラーメッセージを表示するために使用すべき関数/メソッドがありますまた;は必要ありません。

$stmt = $conn->prepare("SELECT * FROM artist WHERE artID != ?"); 
if ($stmt === false){ 
    echo $conn->error; 
    exit; 
} 


$stmt->bindParam('i', $some_variable) 

$result = $stmt->execute(); 

if ($result === false) { 
    echo $stmt->error; 
    exit; 
} 
+0

私はパラメータの値を渡してクエリを実行しました。エラーが発生していて、 'bind'と' execute'がどこにあるかの後にコードを含めなかった理由は 'if'ステートメントを引き起こします。質問では、詳細なエラーメッセージをどうやって取得するのかと尋ねられました。どうして私はそれらを入手するよりも、必要なことを教えていますか? –

+0

その場合は、 'mysqli_'エラーメッセージを使用すると準備が整った後に' if'テストを見てください。それはあなた自身の役に立たないエラーメッセージを作成するよりもずっと多くのことをあなたに与えるでしょう – RiggsFolly

+0

'echo $ stmt-> error;'そして次のような_Noticeを得ました:非オブジェクト_のプロパティを取得しようとしています。 –

0

mysqli_close($conn);最初のクエリが完了した後、次に2番目のクエリの前include 'connection.php';との新しい接続を開くを使用して閉じる最初の接続を。 @ Chay22のクレジット