Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   Vue + Axios + PHP + MySQL (https://javascript.ru/forum/library-toolkit-framework/77155-vue-axios-php-mysql.html)

Volun 31.03.2019 18:10

Vue + Axios + PHP + MySQL
 
Друзья, прошу вашей помощи. Никак не получается настроить поиск по тексту. Поиск по численным значениям работает нормально, а вот текст не выдает. Код элемента 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

Цитата:

Сообщение от Volun
Все равно не ищет по тексту

А чего сделано? Нельзя так потому, что это 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

Как об стену горохом. Ну нельзя так, вы пишите дырявый код, а это опасно, читать и изучать.

Драйвер mysqli имеет не именованные метки, можете их использовать, тогда данные подставляемые в запрос будут обработаны драйвером.

Функция fetch_array() возвращает два идентичных набора, которые вы отдаете клиенту, а зачем? При этом вы просто гоняете данные в цикле, а если над ними не производятся операции, то зачем это, если можно получить сразу набор из запроса?

Volun 02.04.2019 11:18

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

laimas 02.04.2019 11:38

Цитата:

Сообщение от Volun
как передать параметр и принять его

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

Volun 02.04.2019 20:29

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

laimas 03.04.2019 00:16

Цитата:

Сообщение от Volun
keyword передается первым аргументом.

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


Часовой пояс GMT +3, время: 04:48.