[英]using a php function inside of mysql SELECT query?
我们有一个包含数百万种产品和价格的数据库。 我们正在尝试在sql语句中添加一个过滤器,以便缩小搜索范围,然后将其显示在表中。 我们想要过滤的某些内容与定价有关,这给我们带来了问题。
由于我们的价格相当动态,因此我们当前使用php函数实时计算费用,而不是将其存储在数据库中。 我们通过函数传递当前价格,然后将其显示在表格中:
echo profit('99.99'); // output: 12.19
问题是我们无法使用函数查找结果来在查询内部运行这些计算:
$query = "SELECT * FROM `products` WHERE ".profit(."`price` + `shipping` + `acquisition` + `fees`".)." > 10 ";
反正有解决这个问题的方法吗? 我们是否需要遍历所有表值? 由于数据库太大,因此我们试图避免这种情况。 谢谢你的帮助!
您可以在MySQL中创建一个函数,并使该函数为您估算利润。
我不知道您的利润函数有多复杂,因为您没有显示代码。 如果您的“利润”功能不断变化:您做错了。 代码不应该一直更改,很可能您应该更改其设计。
无论如何,这是在MySQL中创建函数的方法http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html
我会采用上述解决方案。 您也可以继续在显示利润的列中进行操作。 每当利润可能发生变化时,请更新该列。 如果products表太大(这是很大的话,我的意思是超过10万行),那么这将非常糟糕。 您可以在批处理过程中更新它们,如果没有索引该列,则只需要花费几分钟,而如果没有索引,则只需要花费几分钟。 如果您有超过10万行的产品,这意味着您的商店很大,并且没有理由不使用上述解决方案来简化添加列。
最坏的情况是,如果您的函数非常复杂,并且需要比MySQL提供的功能更强大的功能(这种可能性很小),则可以在C语言中创建一个函数并将其附加到MySQL。 这是我刚刚找到的教程。 我尚未对其进行验证,但是它看起来很清晰,质量也很高 : http : //blog.loftdigital.com/blog/how-to-write-mysql-functions-in-c
您需要获取值并在您的应用程序中对其进行处理。 您不能将PHP函数传递给MySQL。
如果可能,请使用任何可以执行等效操作的SQL命令。 MySQL支持许多可能可以实现您想要的功能。
通常,这意味着您需要创建一个profit
列,对其进行填充,对其进行索引,然后在查询中使用它:
SELECT * FROM products WHERE profit > 10
关于如何填充它,它可能很简单:
UPDATE products SET profit=(price - shipping - acquisition - fees)
目前尚不清楚为什么要首先将这些数字加起来。
假设您已经这样编写sql:
$query = "SELECT *
FROM `products` ;
然后返回一个名为$result
的2D数组,类似于:
array (
"0" => array (
'price'=>100,
'shipping'=>10,
'acquisition'=>10,
'fees'=>'10'
),
"1" => array (
'price'=>200,
'shipping'=>20,
'acquisition'=>20,
'fees'=>'20'
)
)
现在,由于您具有一个现有的php函数来计算利润,因此可以通过遍历数组来做到这一点:
$expectedResult = array();
foreach ($result as $row) {
if (profit ($row ['price'] + $row ['shipping'] + $row ['acquisition'] +$row ['fees' ) > 10 )
$expectedResult [] = $row ;
}
您将仅在$ expectedResult数组中获得所需的行。
注意 :虽然这是一个解决方案,但却是一个不好的解决方案。 好的解决方案可以是这样的:
这将在这里完成您的技巧而无需太多更改:)快乐的编码:)
我创建了一个简单的PHP函数以使用MySQL查询。
任何查询都可以通过1个简单函数执行。
在选择查询的情况下, 我们可以获取选定的参数,因为变量名称包含选定的参数值。
对于前:
<?php
q("select user_name,email_id from users where user_id=48");
echo $user_name; echo "<br>";
echo $email_id;
?>
或者您可以通过将“”放在“
<?php
q("select user_name as uname, email_id as email from users where user_id=48");
echo $uname; echo "<br>";
echo $email;
?>
结果输出将是:
someuser
someemail
如果选择了更多行,则变量名称将作为 ex 的数组创建 :
<?php
q("select user_name,user_id from users");
for($n=0;$n<count($user_name);$n++)
{
if(count($user_name)==1) // if single row is selected
{
$username_val=$user_name;
$user_ids=$user_id;
}else{
$username_val=$user_name[$n]; // for multiple rows selected
$user_ids=$user_id[$n];
}
echo $username;
}
?>
或者您可以通过将“”放在“
<?php
q("select user_name as un,user_id as uid from users");
for($n=0;$n<count($user_name);$n++)
{
if(count($user_name)==1) // if single row is selected
{
$username_val=$un;
$user_ids=$uid;
}else{
$username_val=$un[$n]; // for multiple rows selected
$user_ids=$uid[$n];
}
echo $username_val; echo " ";
echo $user_ids; echo "<br>";
}
?>
结果输出将是:(如果用户表有三行)
User1 4043
User2 4048
User3 4056
创建mysql连接文件,例如:mysql_connect_file.php
<?php
$dbc=new mysqli('localhost', 'my_user', 'my_password', 'my_db');
?>
php功能如下
<?php
require_once './mysql_connect_file.php';
function q($q)
{
$main_q=$q;
$q= strtolower($q);
global $dbc;
$temp=$q;
$temp=str_replace(" ", "", $temp);
$temp= strtolower($temp);
$temp=".$temp";
if(strpos($temp, "update")==1 || strpos($temp, "insert")==1 || strpos($temp, "delete")==1 || strpos($temp, "alter")==1 || strpos($temp, "create")==1)
{
$rd2= mysqli_query($dbc,$main_q);
if($rd2)
{
return TRUE;
}
else{
$mysql_err= mysqli_error($dbc);
$err= debug_backtrace();
$err_line=$err[0]['line'];
$err_file=$err[0]['file'];
echo "<font color='black'>Error at <b>$err_file on line $err_line </b>query --></font><font color='maroon'>$main_q</font> (<font color='red'> $mysql_err </font> )";
return FALSE;
}
}elseif(strpos($temp, "select")==1){
$qn= str_replace("select ", "", $q);
$qn=substr($qn,0, strpos($qn, " from"));
$qn="$qn,";
$selc= str_replace("`","", $qn);
$qn= str_replace("`","", $qn);
$my_var=array();
$my_nm=array();
for($m=1;$m<=substr_count($selc, ',');$m++)
{
$my_nm[$m]=substr($qn,0, strpos($qn, ","));
$qn=substr($qn,strpos($qn, ",")+1, strlen($qn));
if(strpos($my_nm[$m]," as ")>0)
{
$my_var[$m]= str_replace(" as ", "~", $my_nm[$m]);
$my_var[$m]= str_replace(" ", "", $my_var[$m]);
$my_var[$m]=substr($my_var[$m],strpos($my_var[$m],"~")+1,strlen($my_var[$m]));
}else
{
$my_var[$m]=substr($my_nm[$m],0, strlen($my_nm[$m]));
$my_var[$m]= str_replace(" ","", $my_var[$m]);
}
}
$rn=mysqli_query($dbc, $main_q);
if($rn)
{
if(mysqli_num_rows($rn)>0)
{
for($t=1;$t<=count($my_var);$t++)
{
$$my_var[$t]=array();
}
while($row=mysqli_fetch_array($rn,MYSQLI_ASSOC))
{
if(mysqli_num_rows($rn)>1)
{
for($t=1;$t<=count($my_var);$t++)
{
${$my_var[$t]}[]=$row[$my_var[$t]];
}
}else{
for($t=1;$t<=count($my_var);$t++)
{
$$my_var[$t]=$row[$my_var[$t]];
}
}
}
if(mysqli_num_rows($rn)>1)
{
for($t=1;$t<=count($my_var);$t++)
{
$GLOBALS[$my_var[$t]]= sel_mr($my_var,$$my_var[$t]);
}
for($t=1;$t<=count($my_var);$t++)
{
return $$my_var[$t];
}
}
if(mysqli_num_rows($rn)==1)
{
for($t=1;$t<=count($my_var);$t++)
{
$GLOBALS[$my_var[$t]]=$$my_var[$t];
}
for($t=1;$t<=count($my_var);$t++)
{
return $$my_var[$t];
}
}
}else
{
for($t=1;$t<=count($my_var);$t++)
{
$GLOBALS[$my_var[$t]]=NULL;
}
for($t=1;$t<=count($my_var);$t++)
{
return $my_var[$t];
}
}
}else
{
for($t=1;$t<=count($my_var);$t++)
{
$my= mysqli_error($dbc);
if($t==1)
{
$err= debug_backtrace();
$err_line=$err[0]['line'];
$err_file=$err[0]['file'];
echo "<font color='#ef0000'>Error at <b>$err_file on line $err_line </b>query --></font><font color='maroon'>$q</font> (<font color='red'> $my </font> )";
}
}
for($t=1;$t<=count($my_var);$t++)
{
for($p=0;$p<count($$my_var[$t]);$p++)
{
$a=$$my_var[$t];
return $a;
}
}
}
}
}
function sel_mr($a,$ab)
{
for($t=1;$t<=count($a);$t++)
{
foreach ($ab as $my)
{
${$a[$t]}[]=$my;
}
}
for($t=1;$t<=count($a);$t++)
{
return $$a[$t];
}
}
?>
注意事项:
您可以将此代码保存到文件中,然后可以通过包含该文件名来调用此函数
例如:如果您的文件名为q.php(->包含q函数),则可以通过包含
<?php
include 'q.php';
q("select user_name from users where user_id=4048");
echo $user_name
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.