2016-07-20 4 views
0

編集コード
私はmysqliのコード行:$stmt->bind_param("ss", $_POST['skills'], $_POST['city']);が動作しています。

私はPDOに変更する必要性を見つけたし、使用している:
$stmt->bindValue(':skill', $skills, PDO::PARAM_STR); $stmt->bindValue(':city', $city, PDO::PARAM_STR);

私は反響を除いて何の結果を得るていない「が見つかりません結果、あなたが都市に入りませんでした。?」 「city」の選択リストがロードされている検索フォームに示されているように、dbへの接続が存在するにもかかわらず、エラーメッセージは表示されません。完全なクエリ:

try { 
    global $pdo; 
    if(isset($_POST['search'])) { 
    $skills = htmlspecialchars($_POST['skills']); 
    $city = htmlspecialchars($_POST['city']); 
$stmt = $pdo->prepare('SELECT skill.skill_name, team.city FROM skill JOIN team ON skill.skill_id=team.skill WHERE skill.skill_name LIKE :skills AND team.city LIKE :city'); 
    $skills = "%".$skills."%"; 
    $city = "%".$city."%"; 
$stmt->bindParam(':skills', $skills, PDO::PARAM_STR); 
$stmt->bindParam(':city', $city, PDO::PARAM_STR); 
$stmt->execute(); 
if ($stmt->rowCount() > 0){ 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 

    foreach ($rows as $row) { 
    echo $row['skill'] . " is available in " . $row['city']; 
    } 
} 
else { 
echo "No result found. Did you enter a city?"; 
    } 
    } 
    }//try 
catch(PDOException $e) { 
    echo "Error: " . $e->getMessage(); 
} 


感謝。

+1

疑いでRT .M [PHP PDOマニュアル](HTTPを行.NET /マニュアル/ EN/pdostatement.bindparam.php)相当不思議なことである ' - > bindParam' ___Cryptic what___ – RiggsFolly

+0

' - > bindValue() ' – RiggsFolly

+0

を実行されたクエリの後に、結果セットの外に列を取得するためであります@ SQLSTATE [HY093]:無効なパラメータ番号:パラメータがC:\ wamp \ www ...で定義されていませんでした。 これは使用していると思われます。結合された列の「skill.skill_name」などの「名前」がうまく機能しません。私がやったことのほとんどは、マニュアルや他の質問/回答からです。 –

答えて

1

実際にLIKEを使用する必要がある場合は、文字列のどこかにワイルドカードが必要です。プレースホルダは完全なデータリテラルを表す必要があり、LIKEを使用する場合は、このようなワイルドカードを使用してパラメータを作成する必要があります。

try { 
    global $pdo; 
    if(isset($_POST['search'])) { 
     $skills = '%' . htmlspecialchars($_POST['skills']) . '%'; 
     $city = '%' . htmlspecialchars($_POST['city']) . '%'; 

     $stmt = $pdo->prepare('SELECT skill.skill_name, team.city 
           FROM skill 
           JOIN team ON skill.skill_id=team.skill 
           WHERE skill.skill_name LIKE :skill 
           AND team.city LIKE :city'); 

     $stmt->bindValue(':skill', $skills, PDO::PARAM_STR); 
     $stmt->bindValue(':city', $city, PDO::PARAM_STR); 
     $stmt->execute(); 
     if ($stmt->rowCount() > 0){ 
      $rows = $stmt->fetchAll(); 

      foreach ($rows as $row) { 
       echo $row['skill_name'] . " is available in " . $row['city']; 
      } 
     }else{ 
      echo "No result found. Did you enter a city?"; 
     } 
    } 
} 
catch(PDOException $e) { 
    echo "Error: " . $e->getMessage(); 
} 

MLによって細部の編集:// PHP:修正し$行[ 'スキル'] $には、[ 'skill_name']

+0

ありがとう@RiggsFolly。プレースホルダはソリューションの重要な部分でした。 PDOとMYSQLIによるクエリには若干の違いがあるようです。 mysqliクエリでindex(skill_id)を使用してskill.skill_idにteam.skillを参加させることができたのに対し、私は文字通りskill.skill_nameにPDOとteam.skillを結びつけたときの結果しか得られませんでした。私はWAMPを今週更新してからクエリが機能する前に、MySQLのバージョンかもしれません。私はmysqliの古いバージョンを使用してデータベースの生のクエリを実行し、それは空に戻りました。多分それが働いた恐ろしい事故。 –

関連する問題