#php #mysql #ajax #nested-queries
#php #mysql #ajax #подзапрос
Вопрос:
На самом деле все дело в вопросе 🙂
Когда я указываю в маркерных пунктах, что я хочу сделать, становится понятнее, так что вот оно:
- У меня есть две формы на странице, форма поиска и форма «редактировать профиль». Оба находятся в рабочем состоянии, по отдельности.
- Форма редактирования профиля разбивается на страницы по строкам моего MySQL tbl, позволяя редактировать значения для каждого столбца. В настоящее время настроено на включение всех строк (т. Е. всех сохраненных профилей).
- форма поиска принимает любую из 17 различных переменных поиска и выполняет поиск в той же таблице, чтобы найти профиль или группу профилей.
- Я хочу иметь возможность вводить поисковый запрос (например, имя: ‘Bob’), запрашивать tbl, как я делаю, но использовать AJAX для возврата уникальных идентификаторов результатов в виде массива, хранящегося в переменной. Затем я хочу иметь возможность асинхронно передавать эту переменную в запрос формы моего профиля редактирования (форма поиска будет иметь кнопку отправки …), чтобы теперь я мог просматривать страницы по всем строкам в моей таблице (например, где имя включает ‘Bob’), и только эти строки.
Возможно ли вышеуказанное с рассматриваемыми языками? Кто-нибудь может помочь мне собрать их воедино?
Я на промежуточной стадии работы с PHP и MySQL, но я абсолютный новичок в AJAX. Я когда-либо использовал его только для отображения текстовой строки в определенной области — как видно на демонстрациях повсюду 🙂 Поэтому я очень ценю обращение со мной как с пятилетним ребенком!
Вот мой текущий поисковый запрос и форма редактирования профиля, если они вообще помогут:
Форма редактирования профиля:
//pagination base
if (isset($_GET['page'])) { $page = $_GET['page']; }
else { $page = 1; }
$max_results = 1;
$from = (($page * $max_results) - $max_results);
$total_results = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM profiles"),0);
$total_pages = ceil($total_results / $max_results);
echo '<span id="pagination">' . 'Record ' . $page . ' of ' . $total_results . ' Records Returned. ';
if($total_results > $max_results)
{
if($page > 1)
{ $prev = ($page - 1);
echo "<a href="".$_SERVER['PHP_SELF']."?page=$prev"><input type='submit' value='amp;<amp;<' /></a>";
}
if($page == 1)
{ echo "<input type='submit' value='amp;<amp;<' />"; }
if($page < $total_pages)
{ $next = ($page 1);
echo "<a href="".$_SERVER['PHP_SELF']."?page=$next"><input type='submit' value='amp;>amp;>' /></a>";
}
if($page == $total_pages)
{ echo "<input type='submit' value='amp;>amp;>' />";
}
}
echo '</span></p>';
?>
// the query, currently selecting all but which I would have include a WHERE clause (WHERE ProfileID = $profileid...)
<?php
$sql = ("SELECT * FROM profiles
ORDER BY ProfileID
LIMIT $from, $max_results");
$rs = mysql_query($sql);
while($row = mysql_fetch_array($rs))
{
$profile = $row['ProfileID'];
?>
<form id="profile-form" action="profile-engine.php" method="post">
<input type="hidden" name="formid" value="edit-profile">
<input type="hidden" name="thisprofile" value="<?php echo $profile; ?>">
<table id="profile-detail" class="profile-form">
<tr>
<td>
<label for="profile-name">Name:</label>
<?php
$nameresult = mysql_query("SELECT ProfileName
FROM profiles
WHERE ProfileID = '$profile'");
$row = mysql_fetch_array($nameresult);
?>
<input type="text" class="text" name="profile-name" id="profile-name" value="<?php echo $row['ProfileName']; ?>" />
</td>
//goes on in this vein for another 16 inputs :)
Поисковый запрос:
//connection established
$query = "SELECT * FROM profiles";
$postParameters = array("name","height","gender","class","death","appro","born","tobiano","modifier","adult","birth","sire","dam","breeder","owner","breed","location");
$whereClause = " WHERE 1 = 1";
foreach ($postParameters as $param) {
if (isset($_POST[$param]) amp;amp; !empty($_POST[$param])) {
switch ($param) {
case "name":
$whereClause .= " AND ProfileName LIKE '%".$_POST[$param]."%' ";
break;
case "height":
$whereClause .= " AND ProfileHeight='".$_POST[$param]."' ";
break;
case "gender":
$whereClause .= " AND ProfileGenderID='".$_POST[$param]."' ";
break;
//more cases....
}
}
}
$query .= $whereClause;
$result = mysql_query("$query");
$values = array();
while ($row = mysql_fetch_array($result)) {
$values[] = $row['ProfileID'];
}
/*
//just me checking that it worked...
foreach( $values as $value => $id){
echo "$id <br />";
}
*/
mysql_close($con);
Итак, вот оно! Заранее спасибо за любую помощь!
Ответ №1:
как насчет: search копирует поисковый запрос в локальную переменную, service возвращает массив результатов, которые вы храните, а затем разбивка на страницы использует JS для ввода значений в соответствующие поля. Если вы измените одну из них и сохраните, она отправит изменения, включая исходный поисковый запрос, который используется для повторного запроса сервиса, и вернет обновленный массив … повторите при необходимости
вот несколько примеров кода (здесь всего два поля поиска, я знаю, вам нужно больше):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type="text/javascript">
var query = new Object();
var resp;
var i;
function next(on){
i=on 1;
if(i==resp.results.length){i--;}
fillForm(i);
}
function prior(on){
i=on-1;
if(i<0){i ;}
fillForm(i);
}
function fillForm(i){
document.getElementById("paginate").innerHTML='<button onclick="prior(' i ')">amp;<</button>' (i 1) ' of ' resp.results.length '<button onclick="next(' i ')">amp;></button>';
document.getElementById("name").value=resp.results[i].name;
document.getElementById("height").value=resp.results[i].height;
document.getElementById("gender").value=resp.results[i].gender;
document.getElementById("class").value=resp.results[i].class;
document.getElementById("death").value=resp.results[i].death;
document.getElementById("appro").value=resp.results[i].appro;
document.getElementById("born").value=resp.results[i].born;
document.getElementById("tobiano").value=resp.results[i].tobiano;
document.getElementById("modifier").value=resp.results[i].modifier;
document.getElementById("adult").value=resp.results[i].adult;
document.getElementById("birth").value=resp.results[i].birth;
document.getElementById("sire").value=resp.results[i].sire;
document.getElementById("dam").value=resp.results[i].dam;
document.getElementById("breeder").value=resp.results[i].breeder;
document.getElementById("owner").value=resp.results[i].owner;
document.getElementById("breed").value=resp.results[i].breed;
document.getElementById("location").value=resp.results[i].location;
document.getElementById("id").value=resp.results[i].id;
document.getElementById("saveButton").innerHTML='<button onclick="save()">Save</button>';
}
function getData(){
query.name=document.getElementById('query_name').value;
query.gender=document.getElementById('query_gender').value;
var variables='';
variables ='name=' query.name;
variables ='amp;gender=' query.gender;
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7 , Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 amp;amp; xmlhttp.status==200)
{
resp = JSON.parse(xmlhttp.responseText);
fillForm(0);
}
}
xmlhttp.open("GET","searchNav.php?" variables,true);
xmlhttp.send();
}
function save(){
var saving="";
saving ='?q=' query;
saving ='amp;name=' document.getElementById('name').value;
saving ='amp;height=' document.getElementById('height').value;
saving ='amp;gender=' document.getElementById('gender').value;
saving ='amp;class=' document.getElementById('class').value;
saving ='amp;death=' document.getElementById('death').value;
saving ='amp;appro=' document.getElementById('appro').value;
saving ='amp;born=' document.getElementById('born').value;
saving ='amp;tobiano=' document.getElementById('tobiano').value;
saving ='amp;modifier=' document.getElementById('modifier').value;
saving ='amp;adult=' document.getElementById('adult').value;
saving ='amp;birth=' document.getElementById('birth').value;
saving ='amp;sire=' document.getElementById('sire').value;
saving ='amp;dam=' document.getElementById('dam').value;
saving ='amp;owner=' document.getElementById('owner').value;
saving ='amp;breed=' document.getElementById('breed').value;
saving ='amp;breeder=' document.getElementById('breeder').value;
saving ='amp;location=' document.getElementById('location').value;
saving ='amp;id=' document.getElementById('id').value;
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7 , Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 amp;amp; xmlhttp.status==200)
{
resp = JSON.parse(xmlhttp.responseText);
fillForm(0);
}
}
xmlhttp.open("GET","saveEdits.php" saving,true);
xmlhttp.send();
}
</script>
</head>
<body>
<div id="search">
<table>
<tr><td>Name:</td><td><input type="text" id="query_name" /></td></tr>
<tr><td>Gender:</td><td><input type="text" id="query_gender" /></td></tr></table>
<button onclick="getData()">Search</button>
</div>
<div id="results">
<div id="paginate"></div>
<input type="hidden" id="id" />
<table>
<tr><td>Name:</td><td><input type="text" id="name" /></td></tr>
<tr><td>Height:</td><td><input type="text" id="height" /></td></tr>
<tr><td>Gender:</td><td><input type="text" id="gender" /></td></tr>
<tr><td>Class:</td><td><input type="text" id="class" /></td></tr>
<tr><td>Death:</td><td><input type="text" id="death" /></td></tr>
<tr><td>Appro:</td><td><input type="text" id="appro" /></td></tr>
<tr><td>Born:</td><td><input type="text" id="born" /></td></tr>
<tr><td>Tobiano:</td><td><input type="text" id="tobiano" /></td></tr>
<tr><td>Modifier:</td><td><input type="text" id="modifier" /></td></tr>
<tr><td>Adult:</td><td><input type="text" id="adult" /></td></tr>
<tr><td>Birth:</td><td><input type="text" id="birth" /></td></tr>
<tr><td>Sire:</td><td><input type="text" id="sire" /></td></tr>
<tr><td>Dam:</td><td><input type="text" id="dam" /></td></tr>
<tr><td>Breeder:</td><td><input type="text" id="breeder" /></td></tr>
<tr><td>Owner:</td><td><input type="text" id="owner" /></td></tr>
<tr><td>Breed:</td><td><input type="text" id="breed" /></td></tr>
<tr><td>Location:</td><td><input type="text" id="location" /></td></tr>
</table>
<div id="saveButton"></div>
</div>
</body>
</html>
и поиск:
<?php
//connection established
$query = "SELECT * FROM profiles";
$postParameters = array("name","height","gender","class","death","appro","born","tobiano","modifier","adult","birth","sire","dam","breeder","owner","breed","location");
$whereClause = " WHERE 1 = 1";
foreach ($postParameters as $param) {
if (isset($_POST[$param]) amp;amp; !empty($_POST[$param])) {
$whereClause .= " AND ".$param."='".$_POST[$param]."'";
}
}
$query .= $whereClause;
$result = mysql_query("$query");
echo "{"results":";
if($row = mysql_fetch_array($result,MYSQL_ASSOC)) {
echo "[";
echo "{"name":"".$row["name"]."",";
echo ""height":"".$row["height"]."",";
echo ""gender":"".$row["gender"]."",";
echo ""class":"".$row["class"]."",";
echo ""death":"".$row["death"]."",";
echo ""appro":"".$row["appro"]."",";
echo ""born":"".$row["born"].""";
echo ""tobiano":"".$row["tobiano"].""";
echo ""modifier":"".$row["modifier"].""";
echo ""adult":"".$row["adult"].""";
echo ""birth":"".$row["birth"].""";
echo ""sire":"".$row["sire"].""";
echo ""dam":"".$row["dam"].""";
echo ""breeder":"".$row["breeder"].""";
echo ""owner":"".$row["owner"].""";
echo ""breed":"".$row["breed"].""";
echo ""location":"".$row["location"].""";
//echo ""id":"".$row["id"].""";
echo "}";
}
else{
echo ""no"}";
exit;
}
while($row = mysql_fetch_array($data,MYSQL_ASSOC)){
echo ",{"name":"".$row["name"]."",";
echo ""height":"".$row["height"]."",";
echo ""gender":"".$row["gender"]."",";
echo ""class":"".$row["class"]."",";
echo ""death":"".$row["death"]."",";
echo ""appro":"".$row["appro"]."",";
echo ""born":"".$row["born"].""";
echo ""tobiano":"".$row["tobiano"].""";
echo ""modifier":"".$row["modifier"].""";
echo ""adult":"".$row["adult"].""";
echo ""birth":"".$row["birth"].""";
echo ""sire":"".$row["sire"].""";
echo ""dam":"".$row["dam"].""";
echo ""breeder":"".$row["breeder"].""";
echo ""owner":"".$row["owner"].""";
echo ""breed":"".$row["breed"].""";
echo ""location":"".$row["location"].""";
//echo ""id":"".$row["id"].""";
echo "}";
}
echo "]}";
?>
Комментарии:
1. Вау, лемми, попробуй это. Спасибо!
2. @robot Lol, люблю значения полей 🙂
3. @robot можете ли вы показать, как это можно использовать более чем для одного поля поиска (я не знаю синтаксис Javascript)? Ta. Я также не уверен, куда обращаться со служебным скриптом — похоже, я использую жестко закодированные значения, а не сгенерированные (это только я, я знаю!)…
4. Ну, вы видите, как я сконструировал
saving
переменную? это та же концепция, что и ваша сборка whereclause, затем вы используетедля объединения ее в конец вашего файла поиска… Я изменил код, чтобы иметь второй ввод (но не поиск в фоновом режиме … для этого вы все равно можете использовать поиск, который вы уже создали, вам просто нужно отформатировать вывод в формате JSON [и получить не только ProfileID, но и всю строку])
5. добавлен поиск (но я перешел с LIKE на =, так что вы можете захотеть вернуться) … о, и я закомментировал ‘id’, так что вам придется привести их в соответствие … либо удалите его с главной страницы, либо раскомментируйте в поиске