Вход

Просмотр полной версии : Vue + Axios + PHP + MySQL


Volun
31.03.2019, 18:10
Друзья, прошу вашей помощи. Никак не получается настроить поиск по тексту. Поиск по численным значениям работает нормально, а вот текст не выдает. Код элемента Vue:


var app = new Vue({
el: '#myapp',
data: {
users: "",
searchtext: "",
select: "",
},
methods: {
allRecords: function(){

axios.get('ajaxfile.php')
.then(function (response) {
app.users = response.data;
})
.catch(function (error) {
console.log(error);
});
},
recordByID: function(){

if(this.searchtext >0){

axios.get('ajaxfile.php', {
params: {
searchtext: this.searchtext,
select: this.select,
}
})
.then(function (response) {
app.users = response.data;
})
.catch(function (error) {
console.log(error);
});
}
}
}
})


Код файла PHP который принимает запросы от Vue:


<?php
include "config.php";

if (isset($_GET['select'])) {
$sel = $_GET['select'];
}

if ($sel = "Signups table") {


$condition = "1";
if(isset($_GET['searchtext'])){
$condition = " first_name=".$_GET['searchtext'];
}

$userData = mysqli_query($con,"select * from users WHERE ".$condition);

$response = array();


while($row = mysqli_fetch_assoc($userData)){

$response[] = $row;
}

echo json_encode($response);
exit;
}

if ($sel = "Leads table") {

$condition = "1";
if(isset($_GET['searchtext'])){
$condition = " first_name=".$_GET['searchtext'];
}

$userData = mysqli_query($con,"select * from members WHERE ".$condition);

$response = array();


while($row = mysqli_fetch_assoc($userData)){

$response[] = $row;
}

echo json_encode($response);
exit;
}
?>

laimas
31.03.2019, 18:26
$condition = " first_name=".$_GET['searchtext'];
"select * from users WHERE ".$condition
и тд

Нельзя так, тем более в mysqli.

Volun
31.03.2019, 19:02
Все равно не ищет по тексту

laimas
31.03.2019, 19:53
Все равно не ищет по тексту

А чего сделано? Нельзя так потому, что это 100% инъекция. А что касается поиска, это уже логика.

Вообще, зачем такие дикие по содержанию условия как "Signups table" и "Leads table", что нельзя проще "signups" и "leads"? А далее просто текст запроса формировать, который выполнить один раз и результат отдать клиенту:


$data = mysqli_real_escape_string($_GET['searchtext']);
$sql = $_GET['select']=="signups" ? "select * from users WHERE first_name='".$data."'"
: "select * from members WHERE first_name='".$data."'";
$q = mysqli_query($con, $sql);
exit(json_encode(mysqli_fetch_all($q)));

Условия и проверки добавите сами. А в чем должно искать по числам, это только вам да богу известно, тем более для поля с одним и тем же именем - first_name.

Volun
02.04.2019, 10:41
Ок, нашел проблему с поиском. Сделал живой поиск. Как мне передать в качестве второго параметра значение select в файле
var app = new Vue({
el: '#myapp',
data:{
members: [],
select: "",
search: {keyword: ''},
noMember: false
},
mounted: function(){
this.fetchMembers();
},

methods:{
searchMonitor: function() {
var keyword = app.toFormData(app.search);
axios.post('action.php?action=search', keyword,)

.then(function(response){
app.members = response.data.members;
if(response.data.members == ''){
app.noMember = true;
}
else{
app.noMember = false;
}
});
},

fetchMembers: function(){
axios.post('action.php')
.then(function(response){
app.members = response.data.members;
});
},

toFormData: function(obj){
var form_data = new FormData();
for(var key in obj){
form_data.append(key, obj[key]);
}
return form_data;
},

}
});

чтобы в зависимости от его значения php файл производил поиск по разным базам

<?php
$conn = new mysqli("", "", "", "");

if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$out = array('error' => false);

$action="show";

if(isset($_GET['action'])){
$action=$_GET['action'];
}

if($action=='show'){
$sql = "select * from members";
$query = $conn->query($sql);
$members = array();

while($row = $query->fetch_array()){
array_push($members, $row);
}

$out['members'] = $members;

}

if($action=='search'){
$keyword=$_POST['keyword'];
$sql="select * from members where first_name like '%$keyword%' or last_name like '%$keyword%' or email like '%$keyword%'";
$query = $conn->query($sql);
$members = array();

while($row = $query->fetch_array()){
array_push($members, $row);
}

$out['members'] = $members;
}

$conn->close();

header("Content-type: application/json");
echo json_encode($out);
die();

?>

laimas
02.04.2019, 11:12
Как об стену горохом. Ну нельзя так, вы пишите дырявый код, а это опасно, читать и изучать (https://www.php.net/manual/ru/security.database.sql-injection.php).

Драйвер mysqli имеет не именованные метки (https://www.php.net/manual/ru/mysqli-stmt.prepare.php), можете их использовать, тогда данные подставляемые в запрос будут обработаны драйвером.

Функция fetch_array() возвращает два идентичных набора, которые вы отдаете клиенту, а зачем? При этом вы просто гоняете данные в цикле, а если над ними не производятся операции, то зачем это, если можно получить сразу набор (https://www.php.net/manual/ru/mysqli-result.fetch-all.php) из запроса?

Volun
02.04.2019, 11:18
Спасибо, буду изучать. Но сейчас мне важно как передать параметр и принять его.

laimas
02.04.2019, 11:38
как передать параметр и принять его

Я не знаю, но если список, это не источник события и нужно просто взять его значение текущее, то можно вставить здесь - 'action.php?action=search&select='+document.querySelector(selector).value.

Volun
02.04.2019, 20:29
Не, так работать не будет потому что keyword передается первым аргументом.

laimas
03.04.2019, 00:16
keyword передается первым аргументом.


Причем тут keyword, это что такое ?action=search и как сервером получается? Что проблема методом GET еще один параметр передать? Если так принципиален метод передачи этого параметра, то добавлять его в toFormData после цикла: form_data.append("select", document.querySelector(selector).value);

Volun
03.04.2019, 17:39
В общем сделал вот так
axios.post('action.php?action=search&select='+this.selected, keyword)

вижу что в запросе передается параметр
/action.php?action=search&select=leads
пытаюсь выловить его в php файле как
$select=$_GET['select'];
но ничего не получаю. Подскажите плиз что делаю не так?

laimas
03.04.2019, 17:41
А что такое this.selected?

Volun
03.04.2019, 18:44
data:{
members: [],
selected: "leads",
search: {keyword: ''},
noMember: false
},

laimas
03.04.2019, 18:50
Ну если свойство определено, то оно будет передано и на сервере получить его не будет проблема. Да и проверить это не сложно в отладчике, данные запроса, можно и в консоль все определения вывести. Вы проверяли это?

PS. Да и доступ то будет this.data.selected